上周写了一下对 Service Object 的理解,简单来说是 Rails 里实践单一职责的一种方式,用来提取非 ActiveRecord 类。
没想到的是大家对单一职责理解还存在分歧:
leekelby
上面举例里,就包括了所有: init_beanstream_payment_gateway init_creditcard_options send_payment_info_to_gateway log_credit_card_transaction
也是一团麻,怎么保证 OrderChargeLogic 这个 class 自身的“单一职责”。
https://twitter.com/chloerei/status/582474394208862209
我不买“单一职责原则”的帐,这其实是个文字游戏。只要找到适合的主谓宾,任何多接口主体都可以解释成单一职责,例如 Ruby China 网站 —— 根据用户点击返回相应结果 —— 单一职责。
下面谈一下我对类、单一职责的一点理解。实际上,任何类比的故事都不能证明一个道理的正确性的,它只能帮助你理解这个道理想表达什么意思。
几天前,和朋友去一家云南餐馆吃饭,餐桌上放了一盆铜钱草,朋友问服务员,“这是什么?”,服务员一脸鄙夷的答“植物啊!”
面向对象设计里的类和信息架构里的类很相似。拿植物分类来说,桃、杏、李、樱原本都属于蔷薇科李属。如今已经被植物学家切分成多个类,桃花划归在桃属,杏花梅花在杏属,樱花和樱桃在樱属。
历史学家 Hayden White 说“理解的源头就是分类”。
随着对事物的理解和认识深入,更细化的分类不断产生。因为人们找到了更多的共性和特性。所谓“高聚合”说的就是这个意思。
当我们在创建 class 的时候,其实是在组织信息。把番茄划分到水果还是蔬菜体现的是不同的视角,不过硬要说番茄是植物也没错,但无意义。