• 辣么大
    2019-12-13
    Java.util.concurrent.atomic包下提供了机器底层级别实现的多线程环境下原子操作,相比自己实现类似的功能更加高效。
    AtomicInteger提供了
    intValue() 获取当前值
    incrementAndGet() 相当于++i
    getAndIncrement相当于i++
    从getAndIncrement实现“原子”操作的角度上来说,原子级别的给整数加一,返回未加一之前的值。它的职责是明确的,是符合单一职责的。

    从接口隔离原则上看,也是符合的,因为AtomicInteger封装了原子级别的整数操作。

    补充:
    多线程环境下如果需要计数的话不需旧的值时,推荐使用LongAdder或者LongAccumulator(CoreJava上说更加高效,但我对比了AtomicLong和LongAdder,没感觉效率上有提高,可能是例子写的不够准确。测试代码见 https://github.com/gdhucoder/Algorithms4/tree/master/designpattern/u18 希望和小伙伴们一起讨论)
    展开
     7
     47
  • 李小四
    2019-12-13
    设计模式_18
    纯理论分析,这么设计是不符合“接口隔离”原则的,毕竟,get是一个操作,increment是另一个操作。

    结合具体场景,Atomic类的设计目的是保证操作的原子性,专门看了一下AtomicInteger的源码,发现没有单独的 increment 方法,然后思考了一下线程同步时的问题,场景需要保证 get 与 increment 中间不插入其他操作,否则函数的正确性无法保证,从场景的角度,它又是符合原则的。
     2
     16
  • 时光流逝,而我们在干...
    2019-12-13
    老师可以每次课对上一次课的思考题做下解答吗

    作者回复: 集中答疑一下吧 课都提前录好了

    
     15
  • NoAsk
    2019-12-13
    单一职责原则针对的是模块、类、接口的设计。getAnd
    Increase()虽然集合了获取和增加两个功能,但是它作为对atomicInteger的值的常用方法,提供对其值的常规操作,是满足单一原则的。

    从单一原则的下面这个解释考虑,是不满足接口隔离原则的。“如果调用者只使用部分接口或接口的部分功能,那接口的设计就不够职责单一。”,用户可能调用获取或增加的其中一个方法,再或者先调用增加再调用获取increaseAndGet()方法。

    这是我个人理解,还望大家指正。
    展开
     1
     12
  • 北岛明月🍃
    2019-12-13
    符合SRP 也符合ISP 。

    理由是这个方法完成的逻辑就是一个功能:新增和返回旧值。只不过是两步操作罢了。如果你想获取,就用get方法,自增就用increment 方法。都有提供哇。

    SRP:老师在文中说,实际上,要从中做出选择,我们不能脱离具体的应用场景。所以我认为是符合的。

    ISP: 可以参考老师说的这句话:而接口隔离原则相对于单一职责原则,一方面它更侧重于接口的设计,另一方面它的思考的角度不同。它提供了一种判断接口是否职责单一的标准:通过调用者如何使用接口来间接地判定。如果调用者只使用部分接口或接口的部分功能,那接口的设计就不够职责单一。
    我们调用这个方法肯定是要用它的整个功能,而不是其中的一个新增或自增功能。
    展开
    
     7
  • 小晏子
    2019-12-13
    思考题:
    先看是否符合单一职责原则,这个函数的功能是加1然后返回之前的值,做了两件事,是不符合单一职责原则的!
    但是却符合接口隔离原则,从调用者的角度来看的话,因为这个类是Atomic类,需要的所有操作都是原子的,所以为了满足调用者需要原子性的完成加一返回的操作,提供一个这样的接口是必要的,满足接口隔离原则。
    
     6
  • 墨雨
    2019-12-13
    单一职责是针对于模块、类在具体的需求业务场景下是否符合只做一件事情的原则。
    而接口隔离原则就细化到了接口方面,我是这样理解的,如果接口中的某些方法对于需要继承实现它的类来说是多余的,那么这个接口的设计就不符合接口隔离原则,可以考虑再拆分细化。
    对于课后思考题,他只对该数做了相关操作符合单一职责原则。但从接口、函数来看它实现了两个功能,获取整数及给该整数加一,是不符合接口隔离原则的。
    不知道我这样考虑是否正确,望指正
     1
     3
  • DullBird
    2019-12-14
    感觉是属于比较难判断是否单一职责的内容,顺便回头翻了一下单一职责的章节:在理解一下,单一职责主要还是要结合业务,getAndIncrement的方法实现了: 原子的获取并且新增的这一职责,如果拆开成get和Increment的话,就需要外层加锁处理原子的获取并新增操作,对于业务不太合适。
    从接口隔离的原则看,调用这个方法的类,本身就是依赖这个接口,所以并没有违反。
    想到一个问题:
    如果一个类中,有n个查询的业务接口,根据姓名查,根据年纪查,根据地址查(假设不是参数控制,而是拆成3个接口)。那么不同调用方依赖这个类的时候,有可能是根据姓名查,有可能根据年纪查,如果都拆开了。那么接口是不是粒度太细了
    展开
    
     2
  • 小海
    2019-12-14
    回答课后讨论题得结合具体的场景和运行环境。AtomicInteger的getAndIncrement()函数的职责很单一,就是"获取当前值并递增"这一步原子操作,有人说这是两步操作,这个函数是运行在多线程并发环境下,在这种环境下把获取当前值和递增拆分成两个函数会获得错误的结果,而该函数内部封装了两步操作使其成为一个原子操作,从这个角度任意一方都是另一方的附属品,两者必须同时完成而不能拆分,如果仅仅是为了获取当前值或者递增那完全可以使用该类的其它函数。从调用方的角度,必然是同时用到了获取当前值和递增两个功能,而不是部分功能,明白该函数设计的"单一职责",就知道它符合SRP和ISP,不要试图去拆分一个原子操作。
    
     2
  • 黄林晴
    2019-12-13
    思考题:
    个人感觉,不符合单一职责,也不符合接口隔离,因为函数做了两件事,不应该把获取当前值和值加1放在一起,因为
    1.用户可能需要-1 *1等其他运算操作再返回原始值,这样就要n个方法每个方法中都有返回原始值的操作。
    2.用户可能只想运算操作,不想运算后暴露原始结果
    3.如果用户以后还想获取操作后的值,这个函数就不能同时返回两个值了
    希望大家指正
    展开
    
     2
  • Chen
    2019-12-13
    getAndIncrement()符合接口隔离原则,这是不是一个大而全的函数,而是一个细粒度的函数,跟count++的功能类似。
    
     2
  • LYy
    2020-01-05
    SIP: 如果调用方不完全需要接口提供的全部功能,那么就需要审视接口是否可以进一步拆分。
    
     1
  • 陈拾柒
    2019-12-19
    为什么觉得老师说的,对于接口的三种理解,第一种理解和第三种理解说的是同一件事情~

    作者回复: 不一样呢你再看看

     2
     1
  • Geek_e9b8c4
    2019-12-13
    总结成思维导图了,链接 https://blog.csdn.net/dingshuo168/article/details/103531805
    
     1
  • Jxin
    2019-12-13
    1.我主观认为都符合。

    1.从名命来看,这个方法要做两件事,事实上它也只做了这两件事。所以这个方法的实现满足这个方法抽象的功能范围,耦合单一职责原则。

    2.从使用方来看,返回数值并递增是这类原子类的常规使用场景(longaddr没这方法,蛋疼)。所以对于使用方而言,这个方法包含的两个功能都是其所需要的,所以它也满足接口隔离原则。
    
     1
  • 下雨天
    2019-12-13
    老师提到三种接口的情况可以这样理解:
    1. 接口定义前设计原则(理解成OOP中语法接口或未定义的函数):尽量单一,细粒度!

    2.接口定义后设计原则(理解成粗粒度的一组集合或函数):已有接口按需(调用者或者新功能)拆分或单独定义接口!
    
     1
  • 空空
    2020-02-10
    单一职责原则,侧重于针对某个特定接口,要满足功能的独立性和唯一性;
    接口隔离原则,则强调接口与接口(方法与方法)之间的关系,要满足功能上的相互隔离,
    
    
  • 谷雨
    2020-02-08
    单一职责和接口隔离的区别,我的理解:

    单一职责,是划分域,这部分属于 A,另一部分属于 B。而接口隔离,更侧重不要“给调用者冗余的”,而冗余的本质,其实还是同一域。

    所以,单一职责,是域与域,而接口隔离,是域内。
    
    
  • M
    2020-02-08
    接口隔离原则:我只要我想要的,不想要的别给我
    
    
  • 堵车
    2020-02-08
    我反复思考了很久,觉得第一种接口的例子没有违背接口隔离原则。同样的api组,对delete鉴权了,就不违背,不鉴权就违背了?请老师打醒我。
    
    
我们在线,来聊聊吧