SOLD原则

借鉴:
1. 单一职责原则
单一职责原则 (Single Responsibility Principle,SRP) 指出,每个方法或类应当有且仅有
一个改变的理由。这意味着每个方法或类应当做一件事情,或者只有一项职责。在所有的
SOLID 原则中,这是大多数开发人员感到最能完全理解的一条。严格来说,这也可能是违
反最频繁的一条原则了。
 
2. 开放/ 封闭原则
开放/封闭原则(Open/Close Principle,OCP)是指软件(方法、类等)应当开放扩充且关闭
修改。如果觉得它非常类似于继承的OOP 原则,那就对了。它们之间的关系非常密切。事
实上,在 .NET 中OCP 就是依赖于继承的。
OCP 的要点在于:作为开发人员,别人偶尔会向我们提供基类,偶尔也会为其他开发人
员生成基类框架,供其使用。这些使用者应当仅能使用这些基类,但不能对其进行修改。
这一点是必要的,因为其他使用者也可能依赖于由基类提供的功能。如果允许使用者修改
这些基类,可能会导致连锁反应,不仅会影响到应用程序中的各方面,还会影响到企业内
的应用程序。还有一个问题,使用者有时可能会收到基类的升级版本。使用者在升级之前,
必须找出一种方法用来处理其对该基类先前版本中所做的自定义。
于是,问题变为:“那么,如果我需要修改这个基类的工作方式,那应当怎么做呢?”
OCP 的另一部分中给出这一答案;基类应当开放,可进行扩充。在这里,扩充是指创建一
个由此基类继承而来的派生类,它可以扩充或重载基类功能,以提供使用者所需要的特定
功能。这样,使用者就能使用类的修改版本,而不会影响到类的其他使用者。使用者还可
以在将来更轻松地使用基类的升级版本,因为他们不用担心丢失自己的修改内容。
 
3. 里氏替换原则
继承对于OCP,就相当于多态性对于里氏替换原则(Liskov Substitution Principle,LSP)。
LSP 规定:用超类代替应用程序中使用的对象时,应当不会破坏应用程序。这通常也被称
为“契约式设计(design by contract)”。
回想前面的多态性示例,ComputePay 方法使用了Employee 类型的列表,其中Employee
就是基类型(超类型)。Salary、Hourly 和Seasonal 类都是从Employee 继承而来,因此它们
是Employee 的子类型。
根据LSP,即使已经将列表声明为Employee 的列表,也仍然可以用Salary、Hourly
和Seasonal 的具体实例来填充它。因为有了继承,它们都支持Employee 声明的相同契约(公
共的方法集或API)。应用程序可以对该列表进行迭代,并调用那些在列表中各个项目的
Employee 上定义的方法,不需要知道或特别关心它们都是什么类型。如果它们支持契约,
该调用就是合法的。
 
4. 接口分离原则
到目前为止,已经在示例中使用了基于类的继承,但还没有过多地讨论接口。回想一
下,接口就是在代码中定义的契约,而类同意实现这一契约。这份协议要求类来为接口中
定义的所有方法提供实现。至于如何实现方法,则由这个类来决定,只要它遵守契约,支
持接口中的定义即可。接口是.NET 中功能非常强大的功能;它们对继承和多态的支持方式
与类相同。
接口分离原则(Interface Segregation Principle,ISP)规定,不应当强制客户端依赖于其
不使用的接口。例如,银行系统可能有一个用于评估信用申请的服务。为便于讨论,假定
该服务不仅处理有质押信用(车船贷款、抵押),也处理无质押信用(信用卡、信用证、股票
信用额度)。如果正在开发一个客户端,用于帮助从事汽车代理的金融专员为其客户获得汽
车贷款,则只需要关注汽车贷款的申请即可,无需考虑有关这一服务的任何其他事情。如
果没有 ISP,应用程序可能必须了解其他方法。尽管乍看起来这并没有什么,
但它至少是增加了应用程序的复杂性,因为据以进行开发的 API 中会有许多方法,远远超
出所需要的。这样可能会导致混淆,调用错误的方法还
可能会导致潜在的错误。还有一种可能, API 中未被应用程序用到的部分可能会改变,而
这又会导致对终端的改变。这样,因为没用到、没想用、甚至是根本就不关心的一些功能,
而增加了应用程序的维护成本。这种情况还存在安全风险。该应用程序是专用于汽车贷款
的。如果不道德的开发人员利用这个过于庞大的 API 来允许利用这一申请担保其他类型的
信用,又该怎么办呢?这种问题的严重性就不仅仅是代码瘫痪、不可维护那么简单了。
这一问题的解决方案就是专门针对客户端的需要,为该服务创建几个更小的、更精细
的接口。对于该示例应用程序,专门设计一个针对汽车贷款的接口是比较适当的做法。应
用程序可以用同一实现访问同一个类,但这一次它使用了一个特定的接口,其中仅有实际
服务的一部分方法。这样就降低了复杂性,将应用程序与 API 其他部分的修改隔离开来,
还有助于堵塞安全漏洞。
 
5. 依赖倒置原则
在完美世界里,应用程序的组件之间没有耦合关系或绑定关系。开发人员也能够改变
自己希望改变的任何东西,而不需要担心在应用程序的其他地方出现缺陷,或者“不希望
存在的负面影响”。令人悲伤的是,我们并不是生活在完美世界里。因此,组件需要相互
绑定在一起,或者在某一点耦合,以构成实际应用程序。
依赖倒置原则(Dependency Inversion Principle,DIP)规定:代码应当取决于抽象概念,
而不是具体实现;这些抽象不应当依赖于细节;而细节应当依赖于抽象。类可能依赖于其
他类来执行其工作(Employee 服务可能依赖于数据访问组件向数据存储中保存和检索员工
信息)。但是,它们不应当依赖于该类的特定具体实现,而应当是它的抽象。也就是说,
Employee 服务不知道(或不关心)正在使用哪个具体的数据访问组件——
只有它的抽象或代码契约(或接口)支持那些用于保存和检索员工所需要的方法。显然,
这一概念会大大提高系统的灵活性。如果类只关心它们用于支持特定契约而不是特定类型的组件,
就可以快速而轻松地修改这些低级服务的功能,同时最大限度地降低对系统其余部分的影响。

转载于:https://www.cnblogs.com/handsomemanwhb/p/6099808.html

### 数据仓库中的分层结构实际案例 在构建数据仓库时,采用清晰的分层结构能够有效避免表之间的依赖关系变得复杂和混乱[^1]。一个典型的数据仓库分层架构通常包括以下几个层次: #### 1. 原始层 (Raw Layer) 原始层用于存储未经处理的源系统数据。这些数据保持其原有的格式和细节度,不做任何转换或清洗操作。 ```sql CREATE TABLE raw_sales_data ( transaction_id INT, product_code VARCHAR(50), quantity_sold DECIMAL(18,4), sale_date DATE ); ``` 此部分确保了所有历史记录都可以追溯到最初始的状态,对于审计和支持业务需求非常重要。 #### 2. 清洗层 (Cleaned Layer) 在此阶段,会对来自不同源头的数据进行清理、标准化以及初步的质量控制检查。这一步骤有助于提高后续分析工作的效率并减少错误率。 ```sql INSERT INTO cleaned_sales_facts (transaction_id, standardized_product_code, units_sold, sales_timestamp) SELECT r.transaction_id, p.standardized_code AS standardized_product_code, r.quantity_sold * conversion_factor AS units_sold, CAST(r.sale_date AS TIMESTAMP) AS sales_timestamp FROM raw_sales_data r JOIN product_reference p ON r.product_code = p.original_code; ``` 通过上述SQL语句实现了产品编码统一化,并将日期字段转化为时间戳形式以便于更灵活的时间维度查询。 #### 3. 聚合层 (Aggregated Layer) 为了支持高效报表生成及快速响应BI工具请求,在这一级别上会创建预计算好的汇总视图或者物化视图来加速特定类型的查询性能。 ```sql CREATE MATERIALIZED VIEW aggregated_monthly_sales AS WITH monthly_totals AS ( SELECT EXTRACT(YEAR FROM s.sales_timestamp) AS year_num, EXTRACT(MONTH FROM s.sales_timestamp) AS month_num, SUM(s.units_sold) OVER(PARTITION BY EXTRACT(YEAR FROM s.sales_timestamp),EXTRACT(MONTH FROM s.sales_timestamp)) as total_units_sold_per_month FROM cleaned_sales_facts s ) SELECT DISTINCT year_num,month_num,total_units_sold_per_month FROM monthly_totals ORDER BY year_num DESC ,month_num ASC ; ``` 这段代码展示了如何基于已有的清洁销售事实表建立按月统计销售额的聚合材料化试图,从而极大地提高了针对此类固定模式查询的速度。 --- 这种多级划分不仅使得整个系统的逻辑更加清晰明了,同时也便于维护人员理解和扩展功能模块。更重要的是它遵循了一种良好的实践原则——即每一层只负责自己该做的事情而不越俎代庖,进而降低了各组件间的耦合程度,增强了整体灵活性与可移植性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值