连词我们…讨厌

最近,我写了与实现相关的名称,并提供了一些示例,这些示例由于方法名称与主体之间的紧密关系而导致方法名称不正确。

有一会儿,我们有以下代码:

boolean isComplexOrUnreadableWithTests() { return (complex || unreadable) && tests.exist(); 
}

只是为了提醒您上下文:应该确定我们是否可以进行重构:

if (code.isComplexOrUnreadableWithTests()) {doRefactoring(code);
}

最近,我告诉您该名称是错误的,因为它与实现有直接关系。 但是,这不是唯一的问题。 在方法名称中使用连接词是一个标志,表明我们找不到正确的名称,而仅列出了我们已经完成的所有已知操作。 此列表与实现或逻辑相关都无关紧要。

关于实现还是逻辑?

如果我想将isComplexOrUnvisibleWithTests()方法的名称更改为:

boolean isJustifiedAndPossible() { return (complex || unreadable) && tests.exist(); 
}

会更好吗? 现在不是基于逻辑的名称吗?

我们有关于合理性的部分:

(complex || unreadable)

关于重构的可能性:

tests.exist()

当实现更改时,我们不需要更改名称,对吗? 好吧,不完全是。 让我解释。

我们没有将面向实现的名称更改为面向逻辑的名称。 我们只是混合了。 我们使用已知的词(可能来自领域)将实现隐藏在这两个术语后面。 但是,通过阅读方法的名称,我们仍然知道问题的答案如何。 而且我们仍然不知道最初的问题是什么。

当结果为布尔值时,我假设所问的问题类似于“是吗?” 。 以给出的名称,我们仍然没有关于“某物”的任何信息。

同样,该方法的名称没有我们想象的那么持久。 如果在开发过程中,我们决定从代码中删除tests.exist()部分,则需要在名称中反映此更改并将其更改为:

boolean isJustified() { return complex || unreadable; 
}

此外,您可能会注意到,现在该名称可以准确告诉您问题所在。

但是,初始更改需要在方法主体内部及其名称上进行更改。

遗失词

除了方法本身的名称之外,在某些情况下,我们使用已知术语来描述新事物,但不命名,可能会导致更多问题:

  • 交流 -每次谈论时都会解释该术语。 您只想让另一个人对相同上下文的理解。 用一个单独的短语来表达“ The Something”会更好吗?
    例如,您可能想像一下如果您不能使用设计模式的名称,与其他开发人员的对话将是什么样子。 这些对话肯定会更长,并且会带来更高的误解风险。
    缺少术语会导致完全相同的问题。
  • 复制 –有人可能会问相同的问题,但是由于缺少适当的用语,他们不能百分百确定问题是否真的相同,是否有相同的意图。 在这种情况下,他们有机会选择一种更简单的方法,只编写可以给他们答案的代码。
  • 提出相同的问题 -缺少术语意味着当我们想提出相同的问题时,很难找到此代码。 为什么? 因为我们不知道要寻找什么。 或者我们可能知道,但是代码本身无法表达意图,我们正在寻找的内容与编写的内容之间可能没有关系。

如何发现问题?

嗯,这并不总是像给定示例中那样容易。 但是,有两件事可以帮助您确定名称是好还是需要改进:

  • 结合语 –我们讨论了单一职责原则 ,因此在编写代码时应用此原则很重要。 并没有出现不遵循SRP的征兆吗? 当我们使用“和”或“或”之类的词时,我们通常谈论的不止一件事。
    只要在变量,方法或类的名称中发现连词,就应将其视为警告。 有很大的机会需要改进。
  • 正文更改会导致名称更改 -如果代码更改不能更改功能背后的全部原理,但仍需要更改方法/类的名称,则表明该名称可能未表示真实意图。
    在这种情况下,我们应该重新考虑名称并加以改进。

你好,我的名字是…

我知道有时候找到一个好名字要比编写实现难得多,但这并不意味着我们不应该尝试。 使名称尽可能具有描述性和准确性符合我们自己的利益。 这将节省我们将来的时间。

翻译自: https://www.javacodegeeks.com/2016/06/conjunctions-we-hate.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#常见编译错误

CSharp类型初始值设定项引发异常:类的静态变量初始化遇到异常,或者构造函数中遇到异常

python函数的 全局变量与局部变量

一、函数的全局变量 1、什么是全局变量 顶着头开始写,没有任何缩进,在py文件的任何位置都能调用 #!/usr/bin/env python # _*_ coding:utf8 _*_ name"gouguoqi"name"gouguoqi" def change_name():print ("111",(name)) …

C#程序将DLL包进EXE方法

有时候我们在发布程序的时候只想发布一个EXE,而编写程序的时候往往会有多个DLL,这个时候如果能把这些DLL装进EXE将是一个很令人振奋的事情,事实上对于C#程序有很多方法如下:1. 使用微软的ILMerge(缺点:不支…

org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI

org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI 在重启项目中会遇到[org.springframework.web.servlet.PageNotFound] - No mapping found for HTTP request with URI [*********] in DispatcherServlet with name SpringMVC 这个…

spring本地化默认英文_Spring3国际化和本地化

spring本地化默认英文我最近想将Spring 3提供的国际化和本地化功能添加到我当前的项目之一中。 我浏览了Spring文档,然后在Internet上搜索以找到一些资源。 但是我找不到能够满足客户要求的资源。 大多数教程都像hello world应用程序,它提供了基本的理解…

我所知道的Ribbon库

QT: http://www.devmachines.com/qtitanribbon-overview.html http://qribbon.sourceforge.net MFC、c#可以到微软官方下载 System.Windows.Forms.Ribbon35.DLL - Type: Managed DLL - An Open Source Ribbon Control for .NET WinForm - Read more: http://…

JUnit 5 –动态测试

在定义测试时,JUnit 4有一个很大的弱点:它必须在编译时发生。 现在,JUnit 5将解决此问题! Milestone 1 刚刚发布 ,并带有全新的动态测试,该动态测试允许在运行时创建测试。 总览 本系列中有关JUnit 5的其他…

win8.1自带metro应用不工作解决办法

输入如下命令 powershell -ExecutionPolicy Unrestricted Add-AppxPackage -DisableDevelopmentMode -Register $Env:SystemRoot\WinStore\AppxManifest.XML powershell -ExecutionPolicy Unrestricted Add-AppxPackage -DisableDevelopmentMode -Register $Env:SystemRoot\Im…

python基础-网络基础知识和网络编程

之前对这一块的知识,总是记不住,这次正好有系统的学习,所以决定好好的梳理一下 1. 计算机网络基础知识 1.1 互联网协议和OSI模型 *协议模型互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层,如下图所示 *每层运行常见物理设备 *每层运行常见的协议 1.2 基础网络概念…

HDU 1999 不可摸数

不可摸数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5334 Accepted Submission(s): 1405 Problem Descriptions(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)1234616.如果任…

C语言返回文件大小的功能(fseek和ftell的使用)

需求:有时候读文件时,需要知道文件的字符总的个数,可能是为了提前定义缓冲区大小或者拷贝文件等等。也可以用于动态创建数组。在进行这两个问题之前,先来了解一下两个函数,这两个函数配合就能够实现计算大小的功能。函…

自定义相册、九宫格显示图片

一 自定义相册 结合Glide图片库,加载显示本地图片,并可以实现单选,多选,预览功能。特点 加载最近新增图片,GridView显示分文件夹选择图片支持单选,多选(最大9张)支持大图预览以库的形…

设计一代码,逆置带头结点的动态单链表L

有两种方法&#xff1a; 一是&#xff1a;用头插法建立单链表&#xff0c;自然而然就实现了逆置的动态链表。 代码&#xff1a; #include<stdio.h> #include<malloc.h> typedef int datatype; typedef struct node {datatype data;struct node * next; }linklist…

dll生成lib

来自http://suddymail.org/show-160-1.html没有尝试过&#xff0c;仅供参考。其他链接&#xff1a;http://hi.baidu.com/songxiuying/item/af67755203840f948d12ed6d为无LIB的DLL制作LIB函数符号输入库 本文介绍了在VC中针对无LIB时的DLL隐式链接,制作可供VC使用的LIB函数符号…

maven使用junit3_JUnit,Logback,带有Maven 3的Maven

maven使用junit3在本系列中&#xff0c;我们已经学习了建立基本的Spring MVC应用程序并学习了如何在Spring MVC中处理表单 。 现在该讨论更多涉及的话题了。 但是&#xff0c;在我们涉足更深的领域之前&#xff0c;让我们先进行一些基础设置。 单元测试 我不是TDD传播者。 我在…

LeetCode(90):子集 II

Medium&#xff01; 题目描述&#xff1a; 给定一个可能包含重复元素的整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。 说明&#xff1a;解集不能包含重复的子集。 示例: 输入: [1,2,2] 输出: [[2],[1],[1,2,2],[2,2],[1,2],[] ] 解题思路&…

MFC程序在其他机器运行

为了保证MFC程序能够在没有安装VS的机器上运行&#xff0c;可以采用如下方法。1. 单个的小程序&#xff0c;可以静态编译MFC&#xff0c;但不适用于有很多dll的工程。2. 拷贝VS安装目录Microsoft Visual Studio 11.0\VC\redist\x86\Microsoft.VC110.MFC下的4个文件和Microsoft …

ACM搜索题目总结

ACM搜索题目总结 格式说明&#xff1a;题目名后面列出个人此题的大致难度&#xff08;对菜鸟而言&#xff09; POJ 1069 -The Bermuda Triangle(难) http://acm.pku.edu.cn/JudgeOnline/problem?id1069 题意&#xff1a;用给定三角型填充六边形 解法&#xff1a;此题的思想上精…

JPA中按身份引用

在上一篇文章中 &#xff0c;我提到我选择通过其主键而不是类型来引用其他聚合。 在处理大型或复杂域模型时&#xff0c;我通常使用这种方法&#xff08;也称为断开域模型&#xff09;。 在这篇文章中&#xff0c;让我尝试进一步解释如何在JPA中完成它。 请注意&#xff0c;生成…

在idea下开发出现404错误

用idea开发时&#xff0c;我们一般要设置project strucure里的Modules-Sources,里面对应的有Sources,tests,Resources,Test Resources&#xff0c; Excluded。 同时也可以在maven的pom里面build标签里设置。 <resource><directory>src/main/webapp</directory&g…