2KB项目,专业的源码交易网站 帮助 收藏 每日签到

软件的庞杂性: 定名的艺术

  • 时间:2019-03-18 12:00 编辑:2KB 来源:2KB.COM 阅读:382
  • 扫一扫,手机访问
  • 分享
摘要: 英文原文:Sof
英文原文:Software Complexity: The Art of Naming

想把一个工具写好很难。为何呢?由于只需写好了,才会有很好的浏览体验。我们常常存眷了前者而疏忽了后者。我们遗忘了代码只写一次,但要读非常多次。

写得好是指写出来的工具读起来轻易,而不是指写作自身,这一进程会发生大量的共识。它是指,退后一步,从读者的角度来了解所写的工具。人们必需以人的思想来了解问题,然后用其它人可以了解的方法表达出来。在我看来,软件属于社会科学的一部分。我们要搞明白代码写出来是给谁看的,不是给人看的吗?

因而,了解怎么将思惟和进程转达给我们的同业乃至我们本人,这就是编程的中心。

为组件定名

为了说明白第一个观点,我们来玩一个叫“我们在哪一个房间?”的游戏。我会给出一张图,然后你通知我这是哪一个房间。

3个问题中的第1个

从这个图很轻易判别出来是在客堂。我们从一个组件就可以晓得所处的房间。这十分轻易,我们继续。

3个问题中的第2个

从这个物体很明白的晓得这是在洗手间

发明甚么纪律了吗?房间的称号是一个标签,它界说了这个房间里有甚么。有了这个标签,我们不晓得出来看也晓得外面有点甚么工具。这足以树立我们的第一个推论:

推论 1: 容器的称号包括了其功用元素

留意这是最根本的“鸭子类型”[译者注:假如它的举措像一只鸭子,那它就是鸭子]。假如有一张床,那这里就是卧室。

反过去也是如斯:基于容器的称号,我们可以揣度出它的构成部分。假如我们议论一个卧室,极可能它有一张床。如许发生了我们的第二个推论:

推论 2: 可以依据容器的称号揣度此中的组件

明显我们曾经有了一些规矩,让我们把这些规矩使用到下一个房间。

3个问题中的最初一个

哇,床和马桶怎样会在统一个房间?这个房间的界说很含混,朦昏黄胧,假如必定要用后面的两个推论来为这个房间定名,它只能称为怪物房间

这里的问题不在于房间里物体的数目,而在于完整有关的事物被看做有异样的功用。在家里,我们会把相干的有相似用处或意图的物品放在一同。假如把用处分歧的工具胡乱放在一同,就让人搞不清楚架构师究竟想怎样来运用这些工具。因为凌乱,我们在这里手足无措。


推论 3: 容器界说的明白水平与其外部组件的严密水平成反比。

这仿佛不轻易了解,那来看看图示:

假如组件相干,就很轻易找到一个好名字[译者注:指容器的名字]。假如事务各不相关,找个适宜的名字就会变得艰苦。这里提到的关系,多是指它们的功用、目标、战略、类械寥。在我们谈到规范之前,关系自身其实不包括太多意思。如今先不要急,我们很快就会讲到。

这关于软件异样实用。我们有组件、类、函数、办事、使用顺序和其它一些工具。Robert Delaunay 已经说过“我们的了解与我们的感知相干。”在以后的技巧布景下,我们的代码能否能让读者以最容易的方法感知到营业需求呢?

示例 1: HTTP 范畴和汽车 domain and a car

HTTP 是一个范畴,它有恳求和呼应。假如我们我们在此中放入一个汽车组件,那就不克不及再称这为 HTTP。这类状况下它就曾经变得凌乱了。

public interface WhatIsAGoodNameForThis {
  /* methods for a car */
  public void gas();  public void brake();  /* methods for an HTTP client */
  public Response makeGetRequest(String param); 
}

示例 2: 经过词语来耦合

在类名中添加 Builder 或许其它以 er 开头的单词是种常用的形式。SomethingBuilder、UserBuilder、AccountBuilder、AccountCreator、UserHelper、JobPerformer。

经过称号,我们可以了解三件工作。起首,在类名中运用 Build 这个动词意味着它是穿戴类这件外套的顺序。第二,它有两个暗藏在外部的元素,User 和 Builder,这意味着可能违背了封锁性准绳。第三,这意味着 Builder 可以拜访到 User 的外部任务,究竟它们相互纠缠。

这相似于工场模块。我们的示例代码在全部代码库中滥用时,它就会成为一个问题。另外,我得提示你,在工场形式中不需求甚么类。使用顺序的 createUser() 就可以完成工场的任务。

[译者注:Builder 也是一种形式,所以关于作者的这个观念,请慎思]

示例 3: Base

来看一点实践项目中的例子。第一个例子是 I18n(国际化)的 Ruby Gem (为了简洁起见,只列出了类和办法的称号):

class Base
 def config
 def translate
 def locale_available?(locale)
 def transliterate
end

这里的 Base 其实不能表达甚么意思。它可以实行设置装备摆设和翻译,也能够描绘一个地位能否可用。它做了一些各不类似,绝不相关的工作。

示例 4: 称号领导设计

我们在议论称号怎么领导我们的设计时,提到了好几个例子,让我们感兴味的例子中,有一个以下:

class PostAlerter
 def notify_post_users
 def notify_group_summary
 def notify_non_pm_users
 def create_notification
 def unread_posts
 def unread_count
 def group_stats
end

PostAlerter 这个称号表示我们它的功用是在提交的时分提示或人。但是,unread_postsunread_count 和 group_stats 却很分明在干此外工作,这就使得类称号不太幻想。假如把这三个办法改到名为 PostsStatistics 的类中,表达出来就更明晰,让新接触的人一看就可以清楚。

class PostAlerter
 def notify_post_users
 def notify_group_summary
 def notify_non_pm_users
 def create_notification
end
class PostsStatistics
 def unread_posts
 def unread_count
 def group_stats
end

示例 5: 奇异的称号

Spring 框架中有一些例子阐明组件做的工作太多,其称号相似于我们的怪物房间。这里就有一个 (由于这个就太多了点):

class SimpleBeanFactoryAwareAspectInstanceFactory { public ClassLoader getAspectClassLoader() public Object getAspectInstance() public int getOrder() 
 public void setAspectBeanName(String aspectBeanName) 
 public void setBeanFactory(BeanFactory beanFactory)
}

示例 6: 改动一下,说说好称号

我们讲了太多欠好的称号。D3 的 arc 中就界说了不错的称号,比方:

export default function() {  /* ... */
  arc.centroid     = function() { /* ... */ }
  arc.innerRadius  = function() { /* ... */ }
  arc.outerRadius  = function() { /* ... */ }
  arc.cornerRadius = function() { /* ... */ }
  arc.padRadius    = function() { /* ... */ }
  arc.startAngle   = function() { /* ... */ }
  arc.endAngle     = function() { /* ... */ }
  arc.padAngle     = function() { /* ... */ }  return arc;
}

这些办法每个意义都很有完好的意义:它们都是基于弧所具有的属性来定名的。下图中我十分爱好的一点在于它真的很容易。


办法 1: 拆解

使用场景:你不克不及为类或组件找到好称号,但你晓得怎么拆解它们,并且希冀给它们的组合找到一个好称号。

这包括两个步调:

1. 确认我们具有的观点
2. 拆解它们

在马桶 + 床的状况下,我们把分歧的事物拉开,床在左,马桶在中。好了,我们终究把事物拆分红两个部分,使它们不再那末别扭了。

假如你不克不及为某个事物找到好称号的时分,或许是由于你眼前不只一件事物。不外你如今曾经晓得对多个事物定名是件艰苦的工作。当碰到费事的时分,无妨确认一下组成这个事物的部分和举措。

示例

我们有一个还没有定名的类,包括 requestresponseheadersURLsbodycaching 和 timeout。把一切这些从主类中拉出来,我们剩下了如许一些组件:Request、Response、Headers、URLs、ResponseBody、Cache、Timeout 等。假如我们已知这些类的称号,就会相当断定我们正在处置一个 Web 恳求。HTTPClient 会是个不错的 Web 恳求组件称号。

碰到艰苦的代码时,不要一Start就想着全体。思索一下部分。

办法 2: 发明新观点

使用场景:某个类其实不容易或许不明晰时

发明新的观点需求营业范畴的常识。假如在软件中运用营业术语,由于专业言语曾经树立了并且四处都在运用(Evans, 2003),分歧专业范畴的专业人士就会运用异样的习语。

本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协定,假如我们的任务有进犯到您的权益,请实时联络我们。


2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务

  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【计算机/互联网|】Nginx出现502错误(2020-01-20 21:02)
【计算机/互联网|】网站运营全智能软手V0.1版发布(2020-01-20 12:16)
【计算机/互联网|】淘宝这是怎么了?(2020-01-19 19:15)
【行业动态|】谷歌关闭小米智能摄像头,因为窃听器显示了陌生人家中的照片(2020-01-15 09:42)
【行业动态|】据报道谷歌新闻终止了数字杂志,退还主动订阅(2020-01-15 09:39)
【行业动态|】康佳将OLED电视带到美国与LG和索尼竞争(2020-01-15 09:38)
【行业动态|】2020年最佳AV接收机(2020-01-15 09:35)
【行业动态|】2020年最佳流媒体设备:Roku,Apple TV,Firebar,Chromecast等(2020-01-15 09:31)
【行业动态|】CES 2020预览:更多的流媒体服务和订阅即将到来(2020-01-08 21:41)
【行业动态|】从埃隆·马斯克到杰夫·贝佐斯,这30位人物定义了2010年代(2020-01-01 15:14)
联系我们

Q Q: 7090832

电话:400-0011-990

邮箱:7090832@qq.com

时间:9:00-23:00

联系客服
商家入住 服务咨询 投拆建议 联系客服
0577-67068160
手机版

扫一扫进手机版
返回顶部