草庐IT

读Java8函数式编程笔记07_设计和架构的原则

躺柒 2023-04-16 原文

1. SOLID原则

1.1. 开发良好面向对象程序的准则

1.2. Liskov substitution里氏替换

1.3. Interface segregation接口隔离

1.4. Single responsibility单一功能原则

1.4.1. 程序中的类或方法只能有一个改变的理由

1.4.2. 一个类不仅要功能单一,而且还需将功能封装好

1.5. Open/closed开闭原则

1.5.1. 软件应该对扩展开放,对修改闭合

1.5.1.1. 让软件易于修改

1.5.2. 高阶函数在用多态来实现开闭原则

1.5.3. 使用不可变对象实现开闭原则

1.6. Dependency inversion依赖反转原则

1.6.1. 抽象不应依赖细节,细节应该依赖抽象

1.6.1.1. 待依赖的抽象不必是接口

1.6.2. 让程序员脱离底层粘合代码,编写上层业务逻辑代码

1.6.3. 高阶函数提供了反转控制

1.6.4. 模块化和重用方式是双向的

1.6.4.1. 可以替换不同的细节重用上层代码

1.6.4.2. 可以替换不同的业务逻辑重用细节的实现

2. 不可变性

2.1. 观测不可变性

2.1.1. 在其他对象看来,该类是不可变的

2.1.2. java.lang.String

2.1.2.1. 第一次调用hashCode方法时缓存了生成的散列值

2.1.3. 观测不可变性不意味着实现不可变性

2.2. 实现不可变性

2.2.1. 对象本身不可变

2.2.2. 实现不可变性意味着观测不可变性

3. 设计模式

3.1. 有些模式会变得过时

3.2. Lambda能让很多现有设计模式更简单、可读性更强

3.2.1. 将大量代码塞进一个方法会让可读性变差是决定如何使用Lambda表达式的黄金法则

4. 单例模式

4.1. 应该避免使用的模式

4.2. 敏捷开发使其成了一个反模式

5. 命令者模式

5.1. 命令者是一个对象,它封装了调用另一个方法的所有细节

5.2. 使用该对象,可以编写出根据运行期条件,顺序调用方法的一般化代码

5.3. 函数接口Runnable

5.4. 宏只是使用命令者模式的一个例子,它被大量用在实现组件化的图形界面系统、撤销功能、线程池、事务和向导中

5.5. 使用Lambda表达式或是方法引用,能让代码更简洁,去除了大量样板代码,让代码意图更加明显

6. 策略模式

6.1. 能在运行时改变软件的算法行为

6.2. 定义一个通用的问题,使用不同的算法来实现,然后将这些算法都封装在一个统一接口的背后

6.3. 使用Lambda表达式或者方法引用可以去掉样板代码

7. 观察者模式

7.1. 可被Lambda表达式简化和改进的行为模式

7.2. 被观察者持有一个观察者列表。当被观察者的状态发生改变,会通知观察者。

7.3. 观察者模式被大量应用于基于MVC的GUI工具中,以此让模型状态发生变化时,自动刷新视图模块,达到二者之间的解耦

8. 模板方法模式

8.1. 整体算法的设计是一个抽象类,它有一系列抽象方法,代表算法中可被定制的步骤,同时这个类中包含了一些通用代码

8.2. 算法的每一个变种由具体的类实现,它们重写了抽象方法,提供了相应的实现

8.3. 将一组方法调用按一定顺序组织起来

8.4. 如果用函数接口表示函数,用Lambda表达式或者方法引用实现这些接口,相比使用继承构建算法,就会得到极大的灵活性

8.4.1. 使用函数接口实现方法并没有排除继承的方式

9. 领域专用语言(DSL)

9.1. 针对软件系统中某特定部分的编程语言

9.1.1. 比较小巧

9.1.2. 表达能力也不如通用语言强

9.1.3. 不求面面俱到,但求有所专长

9.2. Domain-Specific Languages

9.2.1. Martin Fowler和Rebecca Parsons合著

9.2.2. Addison-Wesley出版社出版

9.3. 外部DSL

9.3.1. 脱离程序源码编写,然后单独解析和实现

9.3.2. 例如

9.3.2.1. 级联样式表(CSS)

9.3.2.2. 正则表达式

9.4. 内部DSL

9.4.1. 嵌入编写它们的编程语言中

9.4.2. 普通的类库,提供API方便使用

9.4.3. 例如

9.4.3.1. JMock

9.4.3.2. Mockito

9.4.3.3. JOOQ

9.4.3.4. Querydsl

10. 行为驱动开发(BDD)

10.1. 测试驱动开发(TDD)的一个变种

10.2. 它的重点是描述程序的行为,而非一组需要通过的单元测试

有关读Java8函数式编程笔记07_设计和架构的原则的更多相关文章

  1. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  2. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  3. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  4. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  5. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  6. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  7. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  10. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

随机推荐