在 《人人都想学架构(一)》 提到我看过的一篇文章,所以简单翻译分享下,这篇文章的优点在于讲解了很多软件架构方面的概念,正确理解这些概念会让你有个知识框架,避免学的越多越混乱,当然这篇文章主要讲解软件开发架构,而非现在流行的系统架构。怎么说呢,比如《从0开始学架构》讲解的是一个分布式系统架构,提倡三高理论(高并发,高性能,高扩展),而本文强调软件编程,即如何写出好的代码,以及编程原则。
作者发现在 CodeProject 上很多人发表了架构类别的文章,感兴趣的读者也很多,但文章质量堪忧,所以他写了这篇文章,对软件架构概念进行分组、定义、介绍,有了这些概念,在迈向架构师的道路上就更顺畅。
全世界2%的人占据了一半的财富,财富分配相当不平衡,在软件世界中同样如此,软件产业大规模的扩张,迫使开发人员使用现成的库、服务、框架在很短的时间开发软件,不幸的是,这些软件人员从来没有进行过软件架构方面(定义、设计)的培训,随着时间的推移,这些开发者成为了领导者或架构师,头衔是变了,但架构经验还是非常匮乏,优秀架构师仍然凤毛麟角,解决这个问题每天变得越来越难,因为软件行业的侵略性(快速发展)不支持对现有流程进行简单的调整,而且很多架构学习资料要么复杂,要么本身就是错误的,他们使用和现实世界完全不相关的示例来讲解软件架构,但面向业务的设计参考非常少。
就和财富分配一样,优秀的架构师和平庸的开发人员之间有着巨大的鸿沟,而且这种趋势每天都在增加,所以知识的分配也是不平衡的。
对于初学者来说,很难理解一个新概念的定义,因为对你来说不熟悉它,可每个人都是从新手过来的,在这个过程中,你要不断的学习、倾听、思考,所以架构的学习是很漫长的过程。
The knowledge of the actions of great men, acquired by long experience in contemporary affairs, and a continual study of antiquity 《孙子兵法》
1:软件架构的定义
软件架构包含规则,具有启发性,能够进行模式治理。
将问题和系统拆分成独立的pieces
使用技术在这些pieces中创建接口
使用技术管理整体结构和流程
Techniques used to interface the system to its environment
使用适当的开发和交付方法,技术以及工具
2:软件架构的重要性
核心目标是定义系统的非功能需求,The detailed design is followed by a definition of how to deliver the functional behavior within the architectural rules。
管理复杂性
实施最佳实践
给予一致性和均衡性
提高可预测性
重用
3:什么是OOP
OOP是一种设计理念,在OOP中,所有事物被组织为“自我可持续”的对象,主要通过四个概念(后面会说)获得可重用性。
比如手是一个类,通过稍微改变其属性,手可以创建出左手和右手这两个对象,通过接口(肩膀)发送一组信号控制或管理左右手。
4:什么是类
对象可以被认为是可以执行一组相关活动的“事物”。对象执行的活动集定义了对象的行为。
类是对象的一种表示,它是一个蓝图、计划、模版,由名称,属性,操作组成。
在现实世界中,你将发现很多相同类型的独立对象。
5:如何识别和定义类
识别和设计类是一门艺术,每个设计师有不同的技术去识别类,根据面向对象 设计 原则,有5个原则(SOLID)需要留意:
SRP(The Single Responsibility Principle,单一职责原则):一个类应该只有仅有一个原因去修改。
OCP(The Open Closed Principle,开闭原则):软件应该容易扩展,同时抗拒修改,不用修改类就能扩展类的行为,提倡分组隔离,整理成组件结构,使得高阶组件不会因低阶组件被修改而受影响。
LSP(The Liskov Substitution Principle,里氏替换原则):派生类必须可替代其基类,演变成接口与其实现方式的设计原则)。
DIP(The Dependency Inversion Principle,依赖反转原则),依赖于抽象而不是实现,对象的创建过程应该受到严格限制,多用抽象工厂这个设计模式。
ISP(The Interface Segregation Principle,接口隔离原则):客户端调用接口的颗粒度要小,减少依赖和重新编译过程。
为了正确识别一个类,你需要识别出系统的完整功能和操作列表(系统的颗粒度),然后你继续从类中组织出功能函数(类对相同类型的函数或操作进行分组),一个定义良好的类必须是有意义的分组(用于组织函数),同时支持重用,增加可扩展性。
在软件世界中,分而治之的概念是被推荐的,假如你一开始就分析一个完整的系统,你会发现很难管理,所以首先应该寻找方法识别出系统中的模块,然后分别深入每个模块以便找出类。
一个软件系统由很多类组成,类越多就难管理,为了管理这些类(相当于管理大公司的员工),你需要有正确的管理策略,为了减低复杂性,可以采用一些技术,这些技术有四个概念(Encapsulation封装,Abstraction抽象,Inheritance继承,Polymorphism多态)。
一些疑问:
这四个概念在每门编程语言中都会涉及,就是说语言会实现它,但SOLID设计原则并没有出现在语言中,如何区分呢?
这四个概念强调管理类的一些技术,而SOLID强调设计类的原则。
高内聚,松耦合属于设计原则?
还是其他?
和SOLID什么关系?
SOLID和设计模式的区别在哪儿?
6:封装
通过封装,程序对象中包含了对象所需的所有资源(基本上就是方法和数据)。在OOP中,封装 主要 通过创建类来实现,类公开公共方法和公开属性。
类是容器,它封装了methods, attribute ,properties,以便为其他类提供不同的功能,换句话说,封装也允许类修改它的内部实现而不伤害系统的整体功能。
封装的想法是隐藏类的内部逻辑,同时允许其他类向它发出请求。
为了模块/定义一个类的功能,类能够通过多个方法使用其它类暴露出来的functions或properties,在面向对象编程中,有几个方法可以连接每个类,分别是关联(Association),聚合(Aggregation),组合(Composition )。
还有 其他 几种封装的方法,比如接口,接口可以隐藏某个类的具体实现,比如:
IStudent myLStudent = new LocalStudent(); IStudent myFStudent = new ForeignStudent();
LocalStudent和ForeignStudent实现了IStudent接口,可以看出它们通过接口隐藏了自己的本地实现。
今天就写到这儿吧,最后推荐我买的一个专栏《左耳听风》,一个大杂烩专栏,很贵,按我以前的尿性是不会买的,当然买了后我也不是特别推荐买,那我为啥还是买了呢?原因就是想对整个技术体系有个了解,这个专栏有很多的参考资料,相信每个大牛都有自己的知识学习库,能分享出来实属不易(当然也收钱了),比如想学分布式,那么看看他推荐的资料是有益处的。对于我来说,在某个时间,只要你认为有用,那就是值得的,如果你想购买,可以扫描下面的二维码,有返现。