我的“清洁代码”课程中的一个故事。 课堂练习围绕游戏井字游戏的不同方面展开。

我喜欢这款游戏作为练习平台:它似乎不需要任何需求说明。

人们了解游戏,并假设他们确切地知道他们需要如何编写代码。 他们中的大多数跳过设计阶段。 它每次都说明开发人员是如何急于“完成工作”,而不是思考,设计然后编写代码。

最初的练习之一是开始为游戏编写代码,主要侧重于名称和操作,而不是实际使之工作。

在练习结束时,我们将复习其中一名学生的代码。 它看起来像这样:

public class Game{
public Game() {
Board board = new board();
Player playerX = new Player();
Player playerO = new Player();
}
...
}

看起来足够纯真的吧? 我做的练习超出了我的记忆,而且很多次Game类就这样开始了。

事情是这样的:注意游戏创建了棋盘 ? 这意味着每个游戏都有一个新的棋盘。

您知道,在现实生活中,同一块板上会有多个游戏。 如果我们实际上考虑过对Game实例和Board实例之间的关系进行建模,那将是很少的(如果要重新使用Board,则可能是多对一)。

接下来, 游戏创建Player实例。 由于没有说明谁管理玩家的要求,因此Game是可行的设计选择。 我不会讨论它是好是坏,但它是可行的。

尽管如此,正如我们可以阅读的代码所示,我们看到Game类不仅包含PlayerBoard实体,而且实际上创建了它们。

现在,您是否可以将这样的游戏描述给一个不知道每个人都在玩什么的朋友?

不。您可能会这样描述:

棋盘上的两个玩家进行游戏。

虽然代码看起来像:

游戏会创建一个棋盘。 然后创建玩家。

切碎单词

我在Clean Code类中反复提到的一件事是无处不在的语言的重要性。 这意味着我们会在需求,设计,代码,测试,文档和操作中使用尽可能多的真实域(产品语言)中的名称和操作术语。

由于我们正在处理代码,因此您已经看到的是不和谐。 我们看到模型中对象之间的关系并不像我们在现实世界中描述的那样。

当然,它可以更加基础。 参加练习的许多参与者在游戏中对董事会的描述如下:

public class Game {boolean [][] multi = new int[3][3];...
}

我不了解你,但是我从未听过用“ array”这个词描述游戏。 即使是开发人员。 来吧,问他们。

注意你的语言

当然,英语和Java(或者您从这两种语言中获得的任何说服力)是不同的。 语言固有地具有差异。

但是,当我们遇到翻译错误时会发生什么? 有时,我们了解,没有造成任何伤害。 有时我们最终会得到一本奇怪的匈牙利语至英语词典 。

在软件中,我们最终会遇到错误。 其中一些是无关紧要的。 其中一些是建立在错误的假设基础上的,并得到了错误翻译的支持。

我们如何应对翻译错误? 好吧,首先要承认编程是一种翻译活动,因此容易发生翻译错误。

其次,不要跳过设计。 使用代码中域中的术语。

而且,还要讲讲用法故事。 如果我们这样描述游戏:

棋盘上的两个玩家进行游戏。

然后,也许代码应如下所示:

public class Player {public void play(Game game) {...}
}public class Gamepublic void setBoard(Board board) {...}
}

在描述游戏时,只有少数内容可供阅读。 如果您想要易于维护的设计(而不是谁愿意),则从尽可能少的翻译开始。

待会儿你会谢谢你的。

翻译自: https://www.javacodegeeks.com/2018/04/my-hovercraft-is-full-of-eels.html

我的气垫船充满了鳗鱼相关推荐

  1. java 折线_用Java绘制简单的折线图

    只是对气垫船充满鳗鱼的解决方案的补充: 我重新设计了他的代码,对其进行了一些微调,添加了网格,轴标签,现在Y轴从当前的最小值变为最大值.我计划添加一些吸气剂/吸气剂,但我不需要它们,可以根据需要添加它 ...

  2. Science:充满铵盐的环境依然发生固氮

    文章目录 深海古菌在消耗甲烷的微生物群中固定和共享氮 写在前面 平衡氮预算 摘要 正文 图 1 在与CH4和不同的15N标记的N源孵育的沉积物中,有代表性的甲烷氧化菌ANME-2/DSS联合体中,15 ...

  3. [ZT]SQL Server 的事务日志意外增大或充满的处理方法

    http://support.microsoft.com/kb/317375 事务日志文件Transaction Log File是用来记录数据库更新情况的文件,扩展名为ldf. 在 SQL Serv ...

  4. meetup_我在2017年举办Meetup中学到的知识以及为何对2018年充满期待。

    meetup by Daniel Deutsch 由Daniel Deutsch 我在2017年举办Meetup中学到的知识以及为何对2018年充满期待. (What I've learned hos ...

  5. DatagridView自动充满屏幕,并能指定某列宽度

    1.要使datagridview正好充满屏幕,设置其AutoSizeColumnsMode属性为fill 2. 同时,我们想要某列宽点,某列窄点,在AutoSizeColumnsMode属性为fill ...

  6. 技术天地 | CSS-in-JS:一个充满争议的技术方案

    导读 为了解决传统CSS在现代前端应用开发中遇到的痛点,FreeWheel评估了大量新一代的CSS框架/工具/方案.在本文中,作者以评估过程为线索,介绍了CSS-in-JS的背景.现状.开发特点和趋势 ...

  7. 阿里专家张磊:云原生为什么对云计算生态充满吸引力?

    导读:"云原生"究竟是什么?它为什么对云计算生态充满吸引力?中国本土的云原生又该走向何方?我们一起来听听新晋 CNCF TOC 成员张磊的看法. 美国当地时间 2021 年 2 月 ...

  8. 安防业内人士对云存储未来的发展充满信心

    近年来,全球数据量暴涨,世界进入大数据时代,存储系统面临严峻挑战,云存储(cloudstorage)概念应运而生.将目光聚焦于安防行业,随着数字安防技术的普及,监控技术逐渐往高清化.网络化及智能化发展 ...

  9. ScrollView充满屏幕

    <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android=" ...

最新文章

  1. k8s 集群 Ingress Nginx传递用户真实IP问题
  2. Framework 动态库加载 xib
  3. mysql注入式攻击_SQL的注入式攻击方式和避免方法
  4. 一个webservice的初级例子
  5. springIllegalArgumentException Can not set field to $Proxy 在spring中使用事物或AOP遇到的错误
  6. 如何调用webservice接口
  7. 牛顿法与拟牛顿法学习笔记
  8. java万年历JFrame_Java Gui万年历
  9. 毛世怀HPDS2017公路路面设计程序系统
  10. 美联储如期加息带动全球金融市场
  11. 路由器设备升级SNMP日志
  12. 推荐 7 款国产的在线HTML编辑器
  13. 解决win10电脑声音太小的问题
  14. 一图搞懂formula常用符号
  15. 集约式发展 与 粗放式发展
  16. 使用EJS脚本实现花生壳动态域名更新服务(一)
  17. AgileEAS.NET5.0-界面设计器-使用说明书(上)
  18. 工业相机如何调整SDK枚举顺序或者打开顺序
  19. 小学计算机核心素养题,基于核心素养的小学信息技术教学
  20. 应用层与基础知识(题目完成)

热门文章

  1. Java中高级程序员全程学习路线图
  2. java向MySQL插入当前时间的几种方式
  3. 宽带拨号密码查看工具
  4. Sqli-labs 基本注入篇 (Less1~22)
  5. MKMapView用法
  6. hdu 5148 City (树形dp)
  7. html在线编辑器代码运行,JSRun - 在线JS、HTML编辑器(同时也支持各种后台代码的编辑运行)...
  8. 《计算机应用》期刊投稿经验
  9. 机器学习实战——训练模型
  10. carsim与simulink联合仿真-matlab版本切换