当前位置: 首页 > news >正文

建立一个网站需要多少钱?网站设计收费标准

建立一个网站需要多少钱?,网站设计收费标准,更新网站的图片加不上水印,二维码样式大全制作优雅的代码让人赏心悦目#xff0c;low 的代码被一批又一批后来人吐槽。 如何才能写出优雅的代码#xff0c;今天我们就来聊一个特别有效的软件设计原则#xff1a;SOLID。 本文大纲 一、SOLID SOLID 来自 “架构整洁之道” 这本经典的书籍#xff0c;它实际上是五个设…优雅的代码让人赏心悦目low 的代码被一批又一批后来人吐槽。 如何才能写出优雅的代码今天我们就来聊一个特别有效的软件设计原则SOLID。 本文大纲 一、SOLID SOLID 来自 “架构整洁之道” 这本经典的书籍它实际上是五个设计原则首字母的缩写分别是 单一职责原则Single responsibility principle, SRP开放封闭原则Open–closed principle, OCPLiskov 替换原则Liskov substitution principle, LSP接口隔离原则Interface segregation principle, ISP依赖倒置原则Dependency inversion principle, DIP 二、单一职责原则 2.1 什么是单一职责原则 单一职责原则英文是Single responsibility principle简称SRP。这个名字非常容易让我们望文生义理解成一个类只干一件事。既然 SOLID 原则是由 Robert C. Martin 提出和完善的那么可以先看看作者对单一职责原则的描述单一职责原则 (SRP) 指出任何一个软件模块都应该有一个且只有一个修改的理由。 但是软件设计是一门关注长期变化的学问变化是软件中经常遇到的问题在现实环境中软件系统为了满足用户和所有者的要求势必会作出各种修改而系统的用户或者所有者就是该设计原则所指的”被修改的原因”。因此单一职责被作者重新描述为任何一个软件模块都应该只对一个用户或者系统利益相关者负责。 该定义中提及了 用户、系统利益者那么是一个还是多个用户和利益相关者呢是不是只要希望对系统进行修改的都可以统一为行为者因此单一职责最终被作者描述为任何一个软件模块都应该只对某一类行为者负责 2.2 软件模块 上文一直提及的”软件模块”到底是什么呢大部分情况下其简单的定义就是指一个源代码文件比如java中的类接口 方法等也可以是一组紧密相关的函数和数据结构。 任何一个软件模块都应该只对某一类行为者负责怎么理解呢我们来看一个例子 假如设计一个 Employee员工类并且包含3个方法 刚看上去这个类设计得还挺符合实际业务员工有计算薪酬、保存数据、发布促销等行为但是这3个方法对应三类不同的行为者违反了单一职责原则。Employee类将三类行为耦合在一起假如一个普通员工不小心调用了calculatePay()方法把每个员工的薪酬计算成了实际工资的2位那可想而知这是一个灾难性的问题。另外加入没过多久新的需求来了要求员工能够导出报表于是得增加了一个新的方法: 接着需求又一个一个的过来Employee类就得一次一次的变动这会导致什么结果呢 一方面Employee类会不断的膨胀 另一方面内部的实现会越来越复杂。需求完全不同但是却要改动同一个类合理吗 想想你的工作是否也有这样的设计把很多不同行为都耦合到一个类中然后随着业务的增加该类急剧膨胀最后无法维护。 2.3 解决方案 我们可以有很多不同的方法来解决上述的问题特定的行为只能由特定的行为者来操作因此我们可以把Employee拆解成3类行为者将因相同原因而发生变化的事物聚集在一起将那些因不同原因而改变的事物分开。这行为就是定义内聚和耦合的一种方式增加因相同原因而变化的事物之间的内聚减少因不同原因而变化的事物之间的耦合。 2.4 总结 单一职责原则是 SOLID 中最简单的一个单一职责原则本质上就是要理解分离关注点单一职责原则可以应用于不同的层次小到一个函数大到一个系统我们都可以用它来衡量我们的设计 从Robert C. Martin对单一职责描述的变更也可以看出软件设计也不可能一成不变。映射到实际的工作经验我们可以把一个系统模块作为一个单一职责比如订单系统只关注订单相关的行为交易系统只关注交易相关的行为我们可以把类作为一个单一职责比如订单类把订单相关的CRUD聚合在一起。 三、开闭原则 3.1 什么是开闭原则 开放封闭原则英文是Open–closed principle 简称 OCP开闭原则是 Bertrand Meyer 在1988年提出的原则指出 Software entities should be open for extension, but closed for modification. 软件实体应该对扩展开放对修改关闭。 3.2 如何实现开闭原则 “对扩展开放对修改关闭”如何理解呢 我们先看一个案例如下图给出了某公司电商业务中库存变更的简易模型图库存系统接收外部系统库存变更事件然后对数据库中的库存进行修改。 面对这个业务需求很多人的代码会写出这样 这时新的需求来了WMS仓储系统内部会产生盘点事件(盘盈/盘亏)这些事件会导致变更库存。于是代码就会发展成下面这样 很显然上述代码的实现每来一个需求就需要修改一次代码在 updateStock() 方法中增加一个 else if 分支因此 Stock 类就一直处于变更中不稳定。 有没有什么好的办法可以使得这个代码不用被修改但是又能够灵活的扩展满足业务需求呢 这个时候我们就要搬出java的三大法宝继承实现多态。 我们发现整个业务模型是事件导致库存变更。所以能不能把事件抽离出来于是可以把事件模型抽象成一个接口代码如下 每种事件对应一种库存变更抽象成一个具体的实现类代码如下 最后Stock 类中 updateStock() 库存变更逻辑就可以抽象成下面这样 经过我们的抽象、分离和改造之后Stock.updateStock() 类就稳定下来了再也不需要增加一个事件然后增加一个 else if 分支处理。这种抽象带来的好处也是很明显的每次有新的库存变更事件只需要增加一个实现类其他的逻辑都不需要更改当库存事件无效时只需要把实现类删除即可。 3.3 总结 通过上面的案例我们演示了开闭原则的整个抽象和实现过程。业务或许有点简单但是代表意义很强。 开闭原则的核心是对扩展开放对修改关闭。因此当你的业务需求一直需要修改同一段代码时你就得谨慎观察业务是不是和上述案例有类似的问题多思考代码修改的理由是什么它们之间是不是有一定的共同性能不能把这些变更点分离出来通过扩展来实现而不是修改代码 其实在业务开发中还有很多类似的场景比如电商系统中的会员系统需要根据用户不同的等级计算不同的费用机票系统根据用户不同的等级(普通白金用户黄金用户…)提供不同的售票机制网关系统中根据不同的粒度(接口ip服务集群)来实现限流 四、里式替换原则 4.1 什么是 Liskov替换原则 Liskov替换原则(里式替换原则)英文为Liskov substitution principle, 简称LSP它是以作者 Barbara Liskov(一位美国女性计算机科学家对编程语言和分布式计算做出了开创性的贡献于2008年获得图灵奖)的名字命名的Barbara Liskov 曾在1987年的会议主题演讲“数据抽象”中描述了子类型 Let Φ(x) be a property provable about objects x of type T. Then Φ(y) should be true for objects y of type S where S is a subtype of T. 设Φ(x)是关于T类型对象x的可证明性质。那么对于S类型的对象yΦ(y)应该为真其中S是T的子类型。 因为这种科学的定义过于抽象于是在实际软件开发中的 Liskov 替换原则是这样的 The principle defines that objects of a superclass shall be replaceable with objects of its subclasses without breaking the application. That requires the objects of your subclasses to behave in the same way as the objects of your superclass. 该原则定义了在不破坏应用程序的前提下超类的对象应该可以被其子类的对象替换这就要求子类对象的行为方式与您的超类对象相同。 Robert C. Martin 对SLP的描述更加直接: Subtypes must be substitutable for their base types. 子类型必须可以替代它们的基本类型。 通过上面几个描述我们可以把LSP通俗的表达成子类型必须能够替换其父类型。它在java领域描述的是继承关系。 4.2 如何实现 Liskov替换原则 说起Liskov替换原则的实现就不得不先看一个著名的违反 LSP设计案例正方形/长方形问题。尽管这个case已经有点老掉牙但是为了帮助理解我们还是炒一次剩饭。 我们的数学知识告诉我们正方形是一种特殊的长方形认同吗因此用java代码可以分别定义 Rectangle(长方形) 和 Square(正方形)两个类并且 Square extends Rectangle整体代码如下 假设现在的需求是计算几何图形的面积因此面积计算代码会如下实现 按照我们的数学知识上面的逻辑是否都没有毛病 但是用代码实现面积的计算就会出现歧义如果 Rectangle r new Rectangle(); assertThat断言是正确的如果 Rectangle r new Square(); assertThat断言就错误的。显然 正方形是一种特殊的长方形在用代码计算面积时违背了LSP两个类不能相互替换。这就不禁让我们产生怀疑Square is a Rectangle 如何解决这个bad case呢 可以定义一个几何图形的接口设定一个计算面积的方法然后长方形、正方形…都实现这个接口实现各自的面积计算逻辑整体思路如下 我们再来看一个 LSP 使用的例子 假设有一个股票交易的场景而且需要支持债券、股票和期权等不同证券类型的多种交易类型我们就可以考虑使用LSP来解决这个问题 首先我们定义一个交易的基类在基类中我们定义了买入和卖出两个方法实现 接着我们定义了股票交易子类股票交易和交易基类具有相同的行为买入和卖出。所以只需要重写基类的方法实现子类特定的实现就ok了。 同样我们还可以定义了基金交易子类基金交易和交易基类具有相同的行为买入和卖出。所以只需要重写基类的方法实现子类特定的实现就ok了。 同样我们还可以定义了债券交易子类债券交易和交易基类具有相同的行为买入和卖出。所以只需要重写基类的方法实现子类特定的实现就ok了。 上述交易的案例股票交易和基金交易子类替换基类之后并没有破坏基类的买入卖出行为。更具体地说替换的子类实例仍提供buy()和sell()可以以相同方式调用的功能。这个符合LSP。 经过我们的抽象、分离和改造之后Stock.updateStock()类就稳定下来了再也不需要增加一个事件然后增加一个else if分支处理。这种抽象带来的好处也是很明显的每次有新的库存变更事件只需要增加一个实现类其他的逻辑都不需要更改当库存事件无效时只需要把实现类删除即可。 4.3 总结 Liskov替换原则扩展了OCP开闭原则它描述的子类型必须能够替换其父类型而不会破坏应用程序。因此子类需要遵循以下规则 不要对输入参数实施比父类实施更严格的验证规则。至少对父类应用的所有输出参数应用相同的规则。 Liskov替换原则 相对前面的单一职责和开闭原则 稍微晦涩一些因此在开发中容易误用实际工作中特别要注意类之间是否存在继承关系。LSP不仅可以用在类关系上也可以应用在接口设计中。 五、接口隔离原则 5.1 什么是接口隔离原则 接口隔离原则英文为Interface segregation principle 简称ISP。在java中我们一直都强调要面向接口编程足以看出接口在java中的重要性。其实 与单一职责原则类似接口隔离原则的目标是通过将软件拆分为多个独立的部分来减少所需更改的副作用和频率。 接下来就看看作者 Robert C. Martin 对接口隔离原则是怎么定义的 Clients should not be forced to depend upon interfaces that they do not use. 不应强迫客户依赖他们不使用的接口。 不应强迫这不是很明显的事情吗顾客是上帝我们怎么能强迫上帝干不喜欢干的事情呢 或许是我们误解了”不应强迫”它会不会有其他含义呢通常来讲”不应强迫” 有2种理解 第一种理解是用户不能被强迫使用整个接口。第二种理解是用户只使用接口中的部分方法其余的方法不能被强迫使用。 显然第二种理解比较合理所以接口隔离原则可以更直白一点的表达成在接口中不要在接口中使用不需要的方法。 站在接口使用者的角度这样的设计更加人性化为什么要增加一些我不需要的依赖负担呢 5.2 如何实现接口隔离原则 首先让我们来看一个反例假如有一个交通工具的Transportation类类中包含设置价格颜色以及启停等行为方法 汽车属于一种交通工具因此我们可以定义一个 Car类 正如在上面代码的实现可以看出Car不能飞行却要实现 fly() 方法为什么显然fly()这个方法是Car这种交通工具不需要关注这就违反了接口隔离原则。 如何解决这个问题呢 解决方案将交通工具接口分成多个角色接口每个角色接口用于特定的行为。在这里我们可以分成 BasicFeature、 Movable、Flyable 三类行为接口。 Car 只关注 BasicFeature 和 Movable 行为 Airplane 需要关注BasicFeature、Movable 行为、Flyble行为 通过上面的拆解我们可以看到每种交通工具只需要关注自己需要的接口就好了自己不需要的接口就不会被强迫关注更加不会造成 Car 能 fly() 这样的误解。 5.3 总结 接口隔离原则要求在接口中不要在接口使用不需要的方法做接口设计时需要关注不同的使用者不能只关注设计者大而全的接口不一定是好接口 六、依赖倒置原则 6.1 什么是依赖倒置原则 依赖倒置原则英文为Dependency inversion principle 简称DIP。 依赖顾名思义就是A代码里面使用了BA就依赖B这个是我们最能理解的方式。倒置莫非是A依赖B要转成B依赖A 接下来就看看作者 Robert C. Martin 对接口依赖倒置原则是怎么定义的 The Dependency Inversion Principle (DIP) states that high-level modules should not depend on low-level modules; both should depend on abstractions. Abstractions should not depend on details. Details should depend upon abstractions. 依赖倒置原则DIP指出高层模块不应该依赖低层模块两者都应该依赖于抽象。抽象不应该依赖于细节。细节应该取决于抽象。 高层模块不应该依赖低层模块抽象不应该依赖于细节如何理解呢先看几个示例帮助我们理解。 6.2 如何实现依赖倒置原则 高层依赖低层的反例实现一个通知系统当用户账户余额不足时通知用户充值通知的方式有邮箱短信等最常规的实现如下 该代码违背了高层依赖于低层原则每次低层的实现变更高层都需要关注同时该代码也违背了开闭原则。 如何解决 在计算机领域有个经典的理论可以通过引入一个中间层来解决依赖。 因此上面的问题我们可以增加一个中间层比如消息中间件 通过引入中间层高层只需要把信息发送给消息中间件再也不用依赖于下面的通知实现细节。 抽象依赖实现的反例 在实际开发中如果使用dubbo框架实现服务之间的 rpc调用假如订单系统需要从用户系统获取用户的信息。 通常的做法是订单系统会依赖用户系统的 API然后通过 API调用用户系统代码实现如下 这段代码看起来没有毛病假如用户系统 API升级了User类中的name改成了username如果订单系统需要升级用户系统API那么只要订单系统里面使用到 User name 的地方都要修改成username这个入侵太可怕。本来订单系统只是一个抽象的接口调用用户系统但是因为直接依赖了结果值里面的字段导致用户实现细节的变更直接影响订单系统如何解决 可以引进一层防腐层 通过上面的代码改造我们可以看出用户所用的变更都可以在防腐层屏蔽。 SPI机制也是经典的依赖倒置思维 比如在 java中 数据库驱动加载机制。 6.3 总结 依赖倒置是 SOLID 中最难理解的一种原则依赖倒置原则DIP指出高层模块不应该依赖低层模块两者都应该依赖于抽象。抽象不应该依赖于细节。细节应该取决于抽象 七、总结 本文使用实例分别讲解了 SOLID 中各个设计原则 单一职责原则任何一个软件模块都应该只对某一类行为者负责开放封闭原则软件实体应该对扩展开放对修改关闭Liskov替换原则子类型必须能够替换其父类型接口隔离原则不应强迫客户依赖他们不使用的接口依赖倒置原则高层模块不应该依赖低层模块抽象不应该依赖于细节 在实际工作中很多人总抱怨业务开发技术成长慢特别是对于初级程序员但是大部门人的起点都是业务的CRUD如果你能在业务 CRUD 过程中想办法”挖掘”和”套用”某些 设计模式通过这种长期的刻意练习量变产生质变慢慢的你就能领会这些经典设计原则的奥妙无形中你就和身边的小伙伴拉拉开了举例终有一天你也能写出让人赏心悦目的代码。 建议在日常的设计、编写和重构代码时多对标这些原则以便代码更加干净、可扩展和可测试。 八、学习交流 文章总结不易看到这里的小伙伴感谢帮忙点赞收藏或者转发给更多的好友我们将为你呈现更多的干货。
文章转载自:
http://www.morning.dlmqn.cn.gov.cn.dlmqn.cn
http://www.morning.ckwxs.cn.gov.cn.ckwxs.cn
http://www.morning.nrchx.cn.gov.cn.nrchx.cn
http://www.morning.qtwd.cn.gov.cn.qtwd.cn
http://www.morning.jbqwb.cn.gov.cn.jbqwb.cn
http://www.morning.ftync.cn.gov.cn.ftync.cn
http://www.morning.tcfhs.cn.gov.cn.tcfhs.cn
http://www.morning.npfkw.cn.gov.cn.npfkw.cn
http://www.morning.nzcgj.cn.gov.cn.nzcgj.cn
http://www.morning.ltrz.cn.gov.cn.ltrz.cn
http://www.morning.wlgpz.cn.gov.cn.wlgpz.cn
http://www.morning.lqzhj.cn.gov.cn.lqzhj.cn
http://www.morning.ssjry.cn.gov.cn.ssjry.cn
http://www.morning.nhlyl.cn.gov.cn.nhlyl.cn
http://www.morning.qysnd.cn.gov.cn.qysnd.cn
http://www.morning.wffxr.cn.gov.cn.wffxr.cn
http://www.morning.njqpg.cn.gov.cn.njqpg.cn
http://www.morning.fhddr.cn.gov.cn.fhddr.cn
http://www.morning.yfqhc.cn.gov.cn.yfqhc.cn
http://www.morning.gwqkk.cn.gov.cn.gwqkk.cn
http://www.morning.zztkt.cn.gov.cn.zztkt.cn
http://www.morning.brsgw.cn.gov.cn.brsgw.cn
http://www.morning.zqbrw.cn.gov.cn.zqbrw.cn
http://www.morning.mnygn.cn.gov.cn.mnygn.cn
http://www.morning.rnlx.cn.gov.cn.rnlx.cn
http://www.morning.yrjym.cn.gov.cn.yrjym.cn
http://www.morning.zrrgx.cn.gov.cn.zrrgx.cn
http://www.morning.zlgth.cn.gov.cn.zlgth.cn
http://www.morning.lxngn.cn.gov.cn.lxngn.cn
http://www.morning.wynnb.cn.gov.cn.wynnb.cn
http://www.morning.rrbhy.cn.gov.cn.rrbhy.cn
http://www.morning.kzpxc.cn.gov.cn.kzpxc.cn
http://www.morning.kbyp.cn.gov.cn.kbyp.cn
http://www.morning.nfzzf.cn.gov.cn.nfzzf.cn
http://www.morning.rqqmd.cn.gov.cn.rqqmd.cn
http://www.morning.pjbhk.cn.gov.cn.pjbhk.cn
http://www.morning.lgnz.cn.gov.cn.lgnz.cn
http://www.morning.gpxbc.cn.gov.cn.gpxbc.cn
http://www.morning.mqffm.cn.gov.cn.mqffm.cn
http://www.morning.wbns.cn.gov.cn.wbns.cn
http://www.morning.rbbyd.cn.gov.cn.rbbyd.cn
http://www.morning.skwwj.cn.gov.cn.skwwj.cn
http://www.morning.hnhsym.cn.gov.cn.hnhsym.cn
http://www.morning.qsdnt.cn.gov.cn.qsdnt.cn
http://www.morning.tsyny.cn.gov.cn.tsyny.cn
http://www.morning.qnjcx.cn.gov.cn.qnjcx.cn
http://www.morning.xfjwm.cn.gov.cn.xfjwm.cn
http://www.morning.zcwwb.cn.gov.cn.zcwwb.cn
http://www.morning.xkjrs.cn.gov.cn.xkjrs.cn
http://www.morning.sftrt.cn.gov.cn.sftrt.cn
http://www.morning.lmxzw.cn.gov.cn.lmxzw.cn
http://www.morning.rzmsl.cn.gov.cn.rzmsl.cn
http://www.morning.mrckk.cn.gov.cn.mrckk.cn
http://www.morning.trqhd.cn.gov.cn.trqhd.cn
http://www.morning.rpstb.cn.gov.cn.rpstb.cn
http://www.morning.sbczr.cn.gov.cn.sbczr.cn
http://www.morning.bysey.com.gov.cn.bysey.com
http://www.morning.wqmpd.cn.gov.cn.wqmpd.cn
http://www.morning.yqpzl.cn.gov.cn.yqpzl.cn
http://www.morning.ydtdn.cn.gov.cn.ydtdn.cn
http://www.morning.jcfqg.cn.gov.cn.jcfqg.cn
http://www.morning.pyxwn.cn.gov.cn.pyxwn.cn
http://www.morning.nxbkw.cn.gov.cn.nxbkw.cn
http://www.morning.sqnxk.cn.gov.cn.sqnxk.cn
http://www.morning.zkdbx.cn.gov.cn.zkdbx.cn
http://www.morning.pnfwd.cn.gov.cn.pnfwd.cn
http://www.morning.sypby.cn.gov.cn.sypby.cn
http://www.morning.yjmns.cn.gov.cn.yjmns.cn
http://www.morning.dzzjq.cn.gov.cn.dzzjq.cn
http://www.morning.zttjs.cn.gov.cn.zttjs.cn
http://www.morning.yrddl.cn.gov.cn.yrddl.cn
http://www.morning.xmwdt.cn.gov.cn.xmwdt.cn
http://www.morning.lbqt.cn.gov.cn.lbqt.cn
http://www.morning.kqblk.cn.gov.cn.kqblk.cn
http://www.morning.ppbrq.cn.gov.cn.ppbrq.cn
http://www.morning.smcfk.cn.gov.cn.smcfk.cn
http://www.morning.pxwjp.cn.gov.cn.pxwjp.cn
http://www.morning.gpcy.cn.gov.cn.gpcy.cn
http://www.morning.mxcgf.cn.gov.cn.mxcgf.cn
http://www.morning.gcfrt.cn.gov.cn.gcfrt.cn
http://www.tj-hxxt.cn/news/262133.html

相关文章:

  • 重庆响应式网站建设费用南京百度小程序开发
  • 国家小城镇建设政策网站html家具网站源代码
  • 电商网站设计思维导图实时热点新闻事件2021
  • 南京建行网站新浪短网址在线生成
  • wordpress网站被镜像点击排名软件哪个好
  • 河北辛集市网站建设wordpress 播放器插件怎么用
  • 推荐一些做电子的网站网站建设论文参考文献
  • 怎么设置网站权限应用公园app
  • 网站改版收费建设银行官方投诉网站
  • 泰州住房城乡建设网站自己可以制作微信小程序吗
  • 湖南网站建设 搜搜磐石网络网站备案分为几种
  • 做整个网站静态页面多少钱网站建设方案书 腾讯
  • 制作商品网站织梦中二次开发新的网站
  • 陕西省建设银行网站建设大型购物网站
  • 网站seo注意事项wordpress 文章添加附件
  • 浦口区网站建站公司网络公司经营范围哪些
  • 企业快速建站北海市高德小学简介
  • 电商网站平台建设方案wordpress 添加icp
  • 做网站要学会什么wordpress a
  • 网站主题制作怎么找网红推广自己的店
  • 企业网站推广技巧有哪些济南建手机网站哪家好
  • 地方网站 域名选择网站怎么做拉新
  • 免费二级网站信誉好的营销单页网站
  • 怎么做网络推广赚钱宁波外贸seo网站建设
  • o2o网站建设平台指定关键词seo报价
  • 海外微网站建设绵阳欣诚建设
  • 海澜之家网站建设水平安装wordpress后加固
  • 广州专业建设网站pc端网站建设价格明细表
  • 没有公网ip做网站网站建设开票写什么
  • 河南做外贸网站的公司简介短视频网站建设方案