面向对象和系统设计原则

概述

我们进行系统和功能程序设计时,应该有封装,继承,多态的基础概念,拿到需求的时候,时间足够的话,我建议使用UML去建模类图,这样可梳理设计和编码思路,因此下文还会介绍基本的类图关系,之后我们再一起讨论系统设计原则”SOLID“。

什么是对象

对象是指某个类的具体实现,面向对象编程是指把问题领域用实体的方式去建模,设计程序。它区别于面向过程编程,忽略具体的操作细节,把问题领域定位到实体上来。

我们用面向对象的思路去设计超市管理系统,关心并建模的主要应该是超市管理系统有哪些实体对象,这些实体可以进行什么操作。

用面向过程的思路去设计超市管理系统,更关心的是怎么去实现管理,具体的一步一步步骤需要明确,并分解成多个模块去单独实现,然后集成使用。

封装

封装是指对实体的属性和行为的范围界定。保留外部对类的访问接口。

减少耦合:可以独立地开发、测试、优化、使用、理解和修改

减轻维护的负担:可以更容易被理解,并且在调试的时候可以不影响其他模块有效地

调节性能:可以通过剖析来确定哪些模块影响了系统的性能提高软件的可重用性

降低了构建大型系统的风险:即使整个系统不可用,但是这些独立的模块却有可能是可用的

继承

继承是指extends,是is-a的关系,狗有狼狗,土狗之分,白人、黑人都是人,一般继承用于代码复用,一般案例选择"Interface-Abstract-Class"来实现,同一种东西的不同实现。

extends

比如:定义一个Person接口里面有getName(),getLanguage(),在定义一个Abstract:"BasePerson"来实现Person接口,BasePerson仅实现了一个通用的方法getColor,具体的实现类WhitePerson,BlackPerson再去继承BasePerson,这样保证了代码的复用,又可以实现特有的属性。

继承应该遵循里式替换原则,也就是说子类的引用在保证运行结果一致的情况下可以代替父类引用。

多态

多态字面意思是:一个事物有多种状态。多态分为两种状态,编译时多态是重载,一个方法名有不同的实现,运行时多态是指一个接口的引用可以被多个实现类在运行时赋值,也就是一个接口的引用,的具体实现类在运行时才能确定。

UML建模工具

PlantText

泛化关系(Generalization)

表现为继承关系,extends, UML写法为 父类 <|-- 子类

Generalization

实现关系(Realization)

表现为实现,implements, UML写法为 接口 <|.. 实现类

Realization

聚合关系(Aggregation)

可以看做是引用关系,部分是整体的一部分,但部分又可以单独存在。比如公司和员工的关系,公司不在了,但是员工本人还在的,表现为数据库里面就是,公司被删掉了,公司里面的员工id被删掉,但是员工本人的信息还在。

UML: 整体 o-- 部分

Aggregation

组合关系(Composition)

组合就是表面意思,1:n是指一个整体由多个部分组合而成,整体如果不存在了,他的各个部分也就不在了,比如:教学楼,公寓楼,操场,超市,图书馆构成了一个整体:学校。学校如果在数据标记为不可用,由它的各个部分也就不可用了。

UML: 整体 *-- 部分

关联关系(Association)

关联关系是A类包含了一个B类的属性,下图为A知道B,B不知道A。

UML表示为 A-->B

Association

依赖关系(Dependency)

表现为A类中存在以B类为入参,局部变量。

UML表示为A ..> B

Dependency

Solid设计原则

参考资料:

SOLID Principle and Explanation and examples  SOLID五大设计原则

单一职责原则(Single Reponsibility Principle)

The Single-Responsibility Principle: A class should have only one reason to change.

单一职责是指应该尽量让类保持单一的功能。这个也有好处也有坏处,好处就是代码逻辑清晰,坏处就是拆分起来麻烦耗费时间。下面的列子拆分的感觉就是多此一举,但是逻辑代码清晰,所以具体的设计原则要看具体的业务规则来定义,sell是卖,sale是打折卖。

原始类图
单一职责后类图

开闭原则 (The Close/Open Principle)

The Open/Closed Principle (OCP): Software entities (classes, modules, functions, etc.) should be open for extension but closed for modification.

是指程序设计应该对扩展开放,对修改关闭。体现在代码上就是代码是可以扩展的,但是应该避免代码的改动。

典型的案例是queryTables根据传入的标识不同(a,b,c,d)查询不同的数据表(t1,t2,t3),简单的if.else可以快速完成开发任务,但是不符合The Close/Open Principle,原因在于当新增一个标识时,需要改动代码,而不是扩展代码。

Orginal Code

优化策略:使用策略模式优化查询

里式替换原则(Liskov substitution principle)

More generally it states that objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program.

它的意思是父类对象应该可以被它的子类对象代替,并且不影响程序的正确性。一般用法是父类Abstract类实现子类的共有方法(行为一致),子类尽量不覆盖父类的方法,就可保证里式替换原则。

接口隔离原则(Interface Segregation Principle)

In programming, the interface segregation principle states that no client should be forced to depend on methods it does not use.

Put more simply: Do not add additional functionality to an existing interface by adding new methods.Instead, create a new interface and let your class implement multiple interfaces if needed.

意思是接口应该保持单一性,也就是不要合并多个请求到一个接口或者一个business.新增接口的时候,应该新建一个interface。

依赖反转原则(Dependency Inversion Principle)

High-level modules should not depend on low-level modules.Both should depend on abstractions.

Abstractions should not depend on details. Details should depend on abstractions.

意思是高层模块应该不依赖底层模块,而是依赖于抽象。抽象不依赖实现类,实现类应该依赖抽象。实现依赖反转一般用依赖注入(Dependency Injection )。

违反依赖反转类图

比如controller层对service层的依赖反转,我们之前没有依赖注入,controller层需要手动new service,然后对sevice实现类调用,高层依赖底层模块的实现,假如那一天sevice需要扩展另一个类似sevice,controller不得不修改代码。使用抽象可以把高层对底层的依赖转为底层和高层都对抽象的依赖。

优化后类图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342