コード内の命名規則: 間違った比較と正しい比較
プログラミング初心者は、プログラミング言語、構文、テクニック、プログラミング ツールの使用法を学ぶのに常に多くの時間を費やします。彼らは、これらの技術スキルを習得すれば、優れたプログラマーになれると信じています。ただし、コンピューター プログラミングの目的は、これらのテクノロジやツールを習得することではなく、特定の分野における特定の問題に対する解決策を作成することであり、プログラマーはこれらを達成するために協力します。したがって、コードを通じて他の人があなたの意図を理解できるように、自分の考えをコードで正確に表現できることが非常に重要です。
まず、プログラミングの巨匠、ロバート C. マーティンの傑作「クリーン コード」からの一文を見てみましょう。
「コメントの目的は、コード自体の表現の不足を補うことです。」 この文は単純に次のように理解できます。
コードにコメントが必要な場合は、コードの書き方が不十分である可能性が高くなります。同様に、問題やアルゴリズムについての考えをコメントなしでコードで完全に表現できない場合、これは失敗の兆候です。これは最終的に、コードには表示されていない考え方の部分を明確にするためにコメントを使用する必要があることを意味します。 優れたコードは、コメントなしで誰でも理解できます。 優れたコーディング スタイルには、コードの問題を理解するのに役立つすべての情報が含まれています。 プログラミング理論には、「自己記述型ソースコード」と呼ばれる概念があります。コードの一部の場合、一般的な自己記述メカニズムは、変数、メソッド、オブジェクトに対して厳密に定義されていない命名規則に従うことです。この主な目的は、ソース コードを読みやすく理解しやすくすることです。したがって、保守と拡張が容易になります。
この記事では、「悪いコード」とは何か、「明確なコード」とは何かを説明するためにいくつかの例を示します名前は意図を明らかにする必要があります
「d」にはあらゆる意味があります。作者はコメントを使用して意図を示しますが、それをコードで表現することは選択しません。また、「faid」はIDと誤解されやすいです。
int d; // 天数 int ds; int dsm; int faid;
命名時の誤解を避けるための情報
int elapsedTimeInDays; int daysSinceCreation; int daysSinceModification; int fileAgeInDays;
変数「customerList」は実際にはリストではありません。これはプレーンな配列 (またはクライアントのコレクション) です。さらに、「theTable」は Table 型のオブジェクトであり (IDE を使用するとその型を簡単に確認できます)、「the」という単語は不必要に邪魔になります。
Customer[] customerList; Table theTable;
名前は適切な長さでなければなりません
Customer[] customers; Table customers;
良い名前には、コンセプトを表現するために必要な単語だけが含まれている必要があります。不要な単語があると、名前が長くなり、わかりにくくなります。コンテキスト内で完全な意味を表現できる限り、名前は短い方が良いです (注文のコンテキストでは、「list」よりも「customersInOrder」の方が適しています)。
var theCustomersListWithAllCustomersIncludedWithoutFilter; var list;
名前を付けるときはコーディング標準の一貫性を保ち、標準をコードの理解に役立ててください
var allCustomers; var customersInOrder;
コードの一部、その一部を見るだけで、その名前付け方法を見るだけで、それがどのような型であるかを直接理解できるはずです。
const int maxcount = 1 bool change = true public interface Repository private string NAME public class personaddress void getallorders()
例: 「_name」が表示される場合、それがプライベート変数であることがわかります。例外なく、あらゆる場所でこの表現を活用する必要があります。
クリアコード:名前を付けるときは同じ概念を同じ言葉で表現します
const int MAXCOUNT = 1 bool isChanged = true public interface IRepository private string _name public class PersonAddress void GetAllOrders()
最初:
//1. void LoadSingleData() void FetchDataFiltered() Void GetAllData() //2. void SetDataToView(); void SetObjectValue(int value)
代码的作者试图表达“get the data”的概念,他使用了多个词“load”,“getch”,“get”。一个概念只用一个词表达就行了(在同一个场景中)。
第二:
“set”这个词用在了2个概念里:第一是“data loading to view”,第二个是“setting a value of object”。这是两个不同的概念,你应该使用不同的词。
清楚的代码:
//1. void GetSingleData() void GetDataFiltered() Void GetAllData() //2. void LoadDataToView(); void SetObjectValue(int value)
程序员写的所有代码都是跟业务领域场景逻辑相连的。为了让所有关系到这个问题的人都能更好的理解,程序中应该使用在领域环境中有意义的名称。
不好的代码:
public class EntitiesRelation { Entity o1; Entity o2; }
当在编写针对某个领域的代码时,你应该始终考虑使用领域有联系的名称。在将来,当另外一个人(不仅是程序员,也许是测试人员)接触你的代码时,他能轻松的理解这个业务领域里你的代码是什么意思(不需要业务逻辑知识)。你首先考虑的应该是业务问题,之后才是如何解决。
清楚的代码:
public class ProductWithCategory { Entity product; Entity category; }
代码里名称都有自己的上下文。上下文对于理解一个名称非常重要,因为它能提供额外的信息。让我们来看看一个典型的“地址”上下文:
不好的代码:
string addressCity; string addressHomeNumber; string addressPostCode;
在大多数情况中,“Post Code”通常是地址的一部分,很显然,邮政编码不能单独使用(除非你是在开发一个专门处理邮编的应用)。所以,没有必要在“PostCode”的前面加上“address”。更重要的,所以的这些信息都有一个上下文容环境,一个命名空间,一个类。
在面向对象编程中,这里应该用一个“Address”类来表达这个地址信息。
清楚的代码:
class Address { string city; string homeNumber; string postCode; }
概述起来,做为一个程序员,你应该:
命名是来表达概念的
注意名称长度,名称里只该含有必要的词语
编码规范有助于理解代码,你应该使用它
名称不要混用
名称在业务领域里要有意义,在上下文里有意义