面向对象分析与设计Python版 创建者原则与信息专家原则

news2025/1/15 14:39:23

文章目录

  • 前言
  • 一、创建者原则
  • 二、信息专家原则


前言

GRASP是面向对象设计的基本原则,全称是通用职责分配软件原则 GRASP(General Responsibility Assignment Software Principles),是一组用于指导软件设计的原则。包括以下九个主要原则:

  • 信息专家(Information Expert):将职责分配给拥有完成该职责所需信息的类。
  • 创建者(Creator):将创建对象的职责分配给与该对象存在某种关系的类。
  • 控制器(Controller):将处理系统事件的职责分配给表示用例场景的类或表示系统中协调者的类。
  • 低耦合(Low Coupling):尽量减少类与类之间的依赖关系。
  • 高内聚(High Cohesion):尽量将相关的职责分配给同一个类。
  • 多态(Polymorphism):通过接口或抽象基类来定义通用行为,让子类实现具体行为。
  • 纯虚构(Pure Fabrication):创建一些没有直接映射到问题域的类,以更好地实现低耦合和高内聚。
  • 间接性(Indirection):通过引入间接层来降低类之间的直接依赖。
  • 防止变异(Protected Variation):设计系统时,尽量减少对变化的部分的依赖。

一、创建者原则

创建者原则

  • 名称:创建者(Creator)。

  • 应用场景:确定谁负责创建目标类型对象

  • 解决方案:5个对象创建行为的职责分配原则

    • 类B对象是类A对象的聚合体,则B创建A的实例。

    • 类B对象包含类A对象,则B创建A的实例。

    • 类B对象保存A对象,则B创建A的实例。

    • 类B对象使用A对象,则B创建A的实例。

    • 类B对象持有A对象初始化所需的数据,则B创建A的实例。

  • 使用前提:保证业务逻辑一致或正确。

  • 优点:降低代码耦合。

  • 缺陷:有可能会导致对象创建行为分散或不一致。

示例

一个订单处理系统,其中包含两个类:Order(订单)和OrderItem(订单项)。根据Creator原则,Order类应该负责创建OrderItem类的实例。

class OrderItem:
    def __init__(self, product, quantity, price):
        self.product = product
        self.quantity = quantity
        self.price = price

    def get_total_price(self):
        return self.quantity * self.price


class Order:
    def __init__(self, customer):
        self.customer = customer
        self.items: list[OrderItem] = []

    def add_item(self, product, quantity, price):
        # Order类应该负责创建OrderItem类的实例
        item = OrderItem(product, quantity, price)
        self.items.append(item)

    def get_total_order_price(self):
        total_price = 0
        for i in self.items:
            total_price += i.get_total_price()
        return total_price


order = Order("张三")
order.add_item("面包", 3, 2.9)
order.add_item("笔", 2, 1.9)
print(f"总价:{order.get_total_order_price():.2f}")


### 输出结果
总价:12.50

二、信息专家原则

信息专家原则

  • 名称:信息专家(Information Expert)
  • 应用场景:确定目标行为职责应该分配给哪个类或对象
  • 解决方案:
    • 具有行为实现所需业务信息(或数据)的类称为信息专家。
    • 目标行为职责分配给信息专家类或对象,即将职责分配给拥有执行该职责所需信息的类。
  • 优点:降低代码耦合,保持专家类的封装特性。
  • 缺陷:有可能生成浮肿类。

示例

一个学校管理系统,其中包括两个类:Student(学生)和Gradebook(成绩册)。根据信息专家原则,Student类将负责管理关于单个学生的信息,而Gradebook类将负责管理总体成绩相关的操作

class Student:
    """Student类是关于学生成绩的信息专家"""

    def __init__(self, stu_id, name):
        self.stu_id = stu_id
        self.name = name
        self.grades = {}

    def add_grade(self, course, grade):
        self.grades[course] = grade

    def get_grade(self, course):
        return self.grades.get(course, None)


class Gradebook:
    """Gradebook类是关于所有学生平均/加总成绩的信息专家"""

    def __init__(self):
        self.students: dict[int, Student] = {}

    def add_student(self, student: Student):
        self.students[student.stu_id] = student

    def get_student_grade(self, stu_id, course):
        """获取学生的课程成绩"""
        student = self.students.get(stu_id, None)
        if student:
            # 使用Student的信息专家来获取成绩
            return student.get_grade(course)
        else:
            return None

    def get_course_average(self, course):
        """获取所有学生指定课程的平均成绩"""
        stu_count = len(self.students)
        if stu_count == 0:
            return None
        total = 0
        for stu_id in self.students:
            grade = self.students[stu_id].get_grade(course)
            if grade:
                total += grade
        return round(total / stu_count, 2)


stu1 = Student(1, "张三")
stu2 = Student(2, "李四")
stu1.add_grade("语文", 80)
stu1.add_grade("数学", 90)
stu2.add_grade("语文", 85)
stu2.add_grade("数学", 95)

gradebook = Gradebook()
gradebook.add_student(stu1)
gradebook.add_student(stu2)

print(f"张三语文成绩:{gradebook.get_student_grade(1,'语文')}")
print(f"班级数学平均成绩:{gradebook.get_course_average('数学')}")


###输出结果
张三语文成绩:80
班级数学平均成绩:92.5

您正在阅读的是《面向对象分析与设计Python版》专栏!关注不迷路~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2277051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【DB-GPT】开启数据库交互新篇章的技术探索与实践

一、引言:AI原生数据应用开发的挑战与机遇 在数字化转型的浪潮中,企业对于智能化应用的需求日益增长。然而,传统的数据应用开发方式面临着诸多挑战,如技术栈复杂、开发周期长、成本高昂、难以维护等。这些问题限制了智能化应用的…

LVGL移植高通点阵字库GT30L24A3W

字库芯片: GT30L24A3W MCU:STM32F429 LVGL版本:V8.4 一、实现gt_read_data() 和 r_dat_bat() 请参考下面视频 如何在32位MCU上使用高通点阵字库_哔哩哔哩_bilibili 高通字库使用教程(1)硬件链接与注意事项部分_哔哩哔哩_bilibili 高通字库使用教程(2)SPI底层函数使用_哔哩…

一键掌握多平台短视频矩阵营销/源码部署

短视频矩阵系统的介绍与应用 随着数字化营销策略的不断演进,传统的短视频矩阵操作方法可能已显陈旧。为此,一款全新的短视频矩阵系统应运而生,它通过整合多个社交媒体账户、创建多样化的任务、运用先进的智能视频编辑工具、实现多平台内容的…

MySQL(高级特性篇) 06 章——索引的数据结构

一、为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教科书的目录部分,通过目录找到对应文章的页码,便可快速定位到需要的文章。MySQL中也是一样的道理,进行数据查找时,首先查看查询条件…

源码安装httpd2.4

1、下载 wget https://archive.apache.org/dist/httpd/httpd-2.4.54.tar.gz 2.解压下载压缩包 tar -zxvf httpd-2.4.54.tar.gz cd httpd-2.4.54 3、安装httpd所需要的依赖 yum groupinstall "Development Tools" -y 4.配置httpd ./configure --prefix/usr/local/htt…

【算法学习】——整数划分问题详解(动态规划)

🧮整数划分问题是一个较为常见的算法题,很多问题从整数划分这里出发,进行包装,形成新的题目,所以完全理解整数划分的解决思路对于之后的进一步学习算法是很有帮助的。 「整数划分」通常使用「动态规划」解决&#xff0…

文件与IO流:一

一些常识 硬盘特点 擅长顺序读,不擅长随机读,尤其是机械硬盘。 随机读例如某个目录中的所有小文件的复制,顺序读是某个大文件的整体复制。 windows的文件系统是按照“树形结构”来组织文件。 路径的风格 1.绝对路径:从根节点…

计算机网络 (42)远程终端协议TELNET

前言 Telnet(Telecommunication Network Protocol)是一种网络协议,属于TCP/IP协议族,主要用于提供远程登录服务。 一、概述 Telnet协议是一种远程终端协议,它允许用户通过终端仿真器连接到远程主机,并在远程…

WPF系列十二:图形控件CombinedGeometry

简介 CombinedGeometry 是 WPF (Windows Presentation Foundation) 中的一个几何对象,用于将两个几何图形组合成一个新的几何图形。它允许你通过不同的组合模式(如相交、并集、差集或异或)来创建复杂的形状。常与 Path 控件一起使用来绘制组…

《计算机网络》课后探研题书面报告_网际校验和算法

网际校验和算法 摘 要 本文旨在研究和实现网际校验和(Internet Checksum)算法。通过阅读《RFC 1071》文档理解该算法的工作原理,并使用编程语言实现网际校验和的计算过程。本项目将对不同类型的网络报文(包括ICMP、TCP、UDP等&a…

业务幂等性技术架构体系之接口幂等深入剖析

在实际应用中,由于网络不稳定、系统延迟等原因,客户端可能会重复发送相同的请求。如果这些重复请求都被服务器处理并执行,就可能导致意想不到的问题,比如重复扣款、多次下单或者数据不一致等。 这就是为什么我们需要接口幂等性。…

sql模糊关联匹配

需求目标: 建立临时表 drop table grafana_bi.zbj_gift_2024;USE grafana_bi; CREATE TABLE zbj_gift_2024 (id INT AUTO_INCREMENT PRIMARY KEY,userName VARCHAR(255),giftName VARCHAR(255),giftNum INT,points INT,teacher VARCHAR(255),sendDate DATETIME,…

《蜜蜂路线》

题目背景 无 题目描述 一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你&#xff1a;蜜蜂从蜂房 mm 开始爬到蜂房 nn&#xff0c;m<nm<n&#xff0c;有多少种爬行路线&#xff1f;&#xff08;备注&#xff1a;题面有误&am…

LeetCode100之搜索二维矩阵(46)--Java

1.问题描述 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回…

JS爬虫实战演练

在这个小红书私信通里面进行一个js的爬虫 文字发送 async function sendChatMessage(content) {const url https://pro.xiaohongshu.com/api/edith/ads/pro/chat/chatline/msg;const params new URLSearchParams({porch_user_id: 677e116404ee000000000001});const messageD…

自动连接校园网wifi脚本实践(自动网页认证)

目录 起因执行步骤分析校园网登录逻辑如何判断当前是否处于未登录状态&#xff1f; 书写代码打包设置开机自动启动 起因 我们一般通过远程控制的方式访问实验室电脑&#xff0c;但是最近实验室老是断电&#xff0c;但重启后也不会自动连接校园网账户认证&#xff0c;远程工具&…

WPS计算机二级•表格函数计算

听说这里是目录哦 函数基础知识 相对绝对混合引用&#x1f32a;️相对引用绝对引用混合引用 常用求和函数 SUM函数&#x1f326;️语法说明 函数快速求 平均数最值⚡平均数最值 实用统计函数 实现高效统计&#x1f300;COUNTCOUNTIF 实用文本函数 高效整理数据&#x1f308;RIG…

自动化测试工具Ranorex Studio(八十九)-解决方案浏览器

解决方案浏览器 除了为项目添加条目外&#xff0c;’Solution Explorer’允许你编辑解决方案的其他辅助选项。 例如&#xff0c;增加文件夹从而将项目中的录制模块和代码模块分离开来。 图&#xff1a;在solution browser中为项目添加文件夹 另外&#xff0c;你可以删除不用的…

2025 年 UI 大屏设计新风向

在科技日新月异的 2025 年&#xff0c;UI 大屏设计领域正经历着深刻的变革。随着技术的不断进步和用户需求的日益多样化&#xff0c;新的设计风向逐渐显现。了解并掌握这些趋势&#xff0c;对于设计师打造出更具吸引力和实用性的 UI 大屏作品至关重要。 一、沉浸式体验设计 如…

绘制三角形、正六边形、五角星、六角星

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>绘制图形</title><style>body {displ…