lean code-意味のある名前


『Clean Code』という本を読みたいのですが、まとめてみます.文章を読んですぐ忘れてしまうので、私の文字で記録して残しておきたいです.本のボリュームが大きいので、暇なときに読んで整理します.なお,本で紹介したコード例の大部分はjava言語で記述されているが,本人がJSを学習しているため,JSを適切なJS例に変換して記録する.
意味のある名前
良い名前を取るには時間がかかりますが、良い名前を使うと節約する時間がずっとかかります.では、いい名前は何ですか.
の名前をあげる
// 나쁜 예
let d;  

// 좋은 예
let elapsedTimeInDays;
明確な名前で読者に十分な情報を与えることができます.
エラーを回避するメッセージ
プログラマはコードに誤った手がかりを残すべきではない.同時に、広い意味を持つ言葉を他の意味で使うこともできません.
// 아래의 변수들은 유닉스 플랫폼이나 유닉스 변종을 가리키는 이름이다.
hp, aix, sco

//Name은 일반적으로 string 값이 기대된다.
const Name = 100 // X
また,一貫性に乏しいマーキング法は誤った情報である.
// 비슷한 속성, 레벨의 변수들은 같은 표기법을 사용하도록 하자.
let heightOfElements = [...]; // camel case
let width_of_elements = [...]; // snake case
let ColorOfElements = [...]; // pascar case
有意義な地域区分
連続数字をつけた名前(a 1,a 2,...,aN)は故意の名前とは正反対です.
// 연속적인 숫자로 argument 표현
function copyArray(a1, a2){
	a1.forEach( (element, index) => {
    	a2[index] = a1[element];
    })
}

// source, destination이라는 함축적인 의미를 가진 argument 표현
// 함수의 기능이 더 직관적으로 이해된다.
function copyArray(source, destination) {
	source.forEach( (element, index) => {
    	destination[index] = source[element];
    })
}
使用できない単語の名前が追加されても、情報は提供されません.
Productというクラスがあるとします.他のクラスをProductInfoまたはProductDataと呼ぶ場合は、概念を区別せずに異なる名前のみが使用されます.InfoまたはDataは意味不明の用語です.または、Nameと比較して、Name Stringは追加情報を提供できません.名前の値がString値でない場合、上記の「エラーメッセージの回避」の原則に違反するためです.
// 구분할 수 있으신 분?
getActiveAccount();
getActiveAccounts();
getActiveAccountInfo();
読んでいる人に名前をつけて、違いを知らせます.
発音しやすい名前を使う
私たちは単語に詳しいので、脳の大部分は単語という概念だけを処理しています.これらの脳の機能を積極的に使用します.
また、発音の難しい名前を議論するのは難しい.
let genymdhms; // generate date, year, month, day, hour, min, sec 
「JEN WIM DJ A曲M」「JEN YAMU DAHIMs」って発音じゃないですか?(作者は確かにそうです)
let generateTimestamp; // 발음하기도 좋고 의미도 명확한 완벽한 대체재가 있다
検索しやすい名前の使用
特定の変数を探すために、cmd+f(mac標準)コマンドを使用したり、ideの変数検索機能を使用したりすることがあります.このとき変数名をeと考える.eは英語で最もよく使われる文字です.探している変数を見つけるのは本当に難しいです.あるいは変数に数字が含まれているのも問題です.この数値を含むすべてのファイル名または式が検索されるためです.
名前の長さは範囲の大きさに比例する必要があります.著者らは,簡単な方法では,ローカル変数の文字のみを用いると述べた.複数のコードで変数または定数を使用する場合は、検索しやすい名前を使用することが望ましい.
// 프로젝트 전반에서 사용할 것 같은 변수명. 검색도 매우 쉽다.
const WORK_DAYS_PER_WEEK =5;
自分の記憶力をひけらかすな
自分でしか覚えられない変数名は使用しないでください.
プログラミングでは、はっきりしているのが一番だと覚えておいてください.
//ㅎㅎ 나는 항상 r을 url 대신 사용하지롱~ (잘못된 예)
let r = "https://velog.io"
クラス名
クラス名とオブジェクト名は名詞または名詞フレーズに適しています.動詞を使わない.
// 적합
Customer, Account, AddressParser

// 부적합
Manager, Processor, Data, Info
メソッド名
メソッド名は動詞や動詞のフレーズに適しています.
const name = employee.getName();
customer.setName("mike");
変な名前を使うな
プログラマーは自分の才能を発揮し、口語体やスラングを名前として使うことがあります.すなわち,プログラミングにおいて,意図を明確かつ率直に表現することが望ましい.
一つの概念に一つの語を使う
抽象的な概念の中で1つの語を選んでこの点を堅持します.
// get, fetch, retrieve 중 하나로 통일하자.
class Customer {
	getName() {...}
    fetchAge() {...}
    retrieveAddress() {...}
}
同様に、controller、manager、driverが混在すると混乱します.
一つの言葉を二つの目的に使わないでください.
//가상의 고객 클래스
class Customer {
	// level: 고객 등급, inventory: 고객 인벤토리, ...
	constructor(level, inventory, ...){
    		this.level = level;
        	this.inventory = inventory;
        	...
    	}
    
	// 여기서 add는 단순 합을 뜻한다.
	addLevel(operand){
    		this.level += operand;
    	}
    
    	// 여기서 add는 집합에 새로운 값을 추가한다.
	addItem(newItem){
    		this.inventory.push(newItem);
    	}
}
上記の例では、2つの方法は同じadd動詞を使用しているが、コンテキストでは異なるaddである.
したがって、addItemの場合、insertItemまたはappendItemを使用できます.
プログラマーが熟知しているテクノロジー概念を使用する
コードを読む人も最終的にプログラマーです.Queue,Stack,Listを表す場合には,対応する技術名を用いることが適切である.
意味のある脈絡を追加
プログラマは、通常、クラス、関数、およびネーミングスペースに変数を追加してコンテキストを付与します.
firstName, lastName, street, state

//클래스에 집어 넣으면 위의 변수들이 Address라는 맥락에 속함을 알 수 있다.
class Address {
	constructor(firstName, lastName, street, state){
    		this.firstName = firstName;
        	this.lastName = lastName;
        	this.street = street;
        	this.state = state;
    	}
}
余分な脈絡を取り除く
例えば、高級ガソリン注入ステーションというアプリケーションを作成することを想定する.この場合,「GSD」で始まるという考えは全く望ましくない.これはIDEの自動完了機能を妨げる可能性があります.余分な脈絡を追加しないように注意してください.
同様に、AccountAddressやCustomerAddressよりもクラス名として適しています.
作者の言いつけ
開発者が既存の名前を変更したくない理由の一つは、他の開発者の反対を恐れているからだという.でもいい名前に変えたら嬉しいし感謝します.コードを改善する努力を止めないでください.