変数名
配列([]
)に変更して、
- itemList
- productList
- goodsList
または、new Map
に変更して、
- itemMap
- productMap
- goodsMap
配列風の名前
配列風に語尾にsを付けています。
私は「末尾に s
を付ける名前」を避けるようにしています。
理由は「item と items を一目で見分けられないから」です。
item
と itemList
なら違いが明確になります。
ただ、名前的に配列と見分けがつかないので、悩んでおります。
個人的には配列のように見えるので、配列を使いたくなります。
バーコードはオブジェクト内に含まれており、バーコードをキーにする理由が明確でない為です。
バーコードをキーにする方が都合が良いのであれば、new Map
を選択します。
変数名の末尾にsを付ける命名規則の是非
変数名の末尾に s
を付ける事で複数形である事を示せますが、実際のところ、複数形の中にも種類があります。
JavaScript
13
4var items = [{barcode: 1, name: "name_1"}, {barcode: 2, name: "name_2"}, {barcode: 3, name: "name_3"}];
5var items = new Map([[1,{barcode: 1, name: "name_1"}], [2,{barcode: 2, name: "name_2"}], [3,{barcode: 3, name: "name_3"}]]);
6
79
10var itemList = [{barcode: 1, name: "name_1"}, {barcode: 2, name: "name_2"}, {barcode: 3, name: "name_3"}];
11var itemMap = new Map([[1,{barcode: 1, name: "name_1"}], [2,{barcode: 2, name: "name_2"}], [3,{barcode: 3, name: "name_3"}]]);
前者は配列と new Map
を区別できませんが、後者は区別できます。
「末尾に s
を付ける命名規則」が通用するのは、次のどちらかのルールが課せられている為です。
- 複数形が一種類しか存在しない
- 複数形は配列であるとコーダが決め打ちしている(この場合、
new Map
は itemMap
のように命名して区別する)
前者はコードリーディングする人がオブジェクト初期化部分のコードまで追いかけないと、変数の中身を確認できない事を意味します。
後者はコーダが勝手に「複数形は配列」と決め打ちしていますが、コードリーディングする人がそのルールとは限りません。
複数形である以上、配列以外のオブジェクトにも s
を付ける可能性があります。
例えば、DOMノードを使ったコードでも s
を使った命名規則を見かける事があります。
JavaScript
1var imgs = document.getElementsByTagName('img');
一見、このコードは問題ないように見えますが、変数 imgs
に格納されるのは HTMLCollection
です。
DOMの複数形には NodeList
があり、「querySelectorAll()
で参照した変数(NodeList)」と「getElementsByTagName
で参照した変数(HTMLCollection)」を区別できない、という問題があります。
両者を区別するには、次のように書きます。
JavaScript
1var imgCollection = document.getElementsByTagName('img'); // HTMLCollection
2var imgList = document.querySelectorAll('img'); // NodeList
HTMLCollection
は live ですが、NodeList
は live ではない、という性質の違いもあり、名前を区別する事で性質の違いも明確となります。
ところで、DOM Interface には Node
がありますが、複数形は Nodes
ではなく、NodeList
もしくは HTMLCollection
である点に気が付いたでしょうか。
Nodes
と命名すると、「Node の複数形」が一つで決め打ちされてしまう為、ユニークな単語を末尾に着ける事で両者を区別しています。
英語でも Interface 名、コンストラクタ名などには末尾に s
を付ける文化はないように感じています。
少なくとも、私が今までに DOM の仕様書を読んだ中では、末尾に s
を付けた Interface 名を見ていません。
これは後から複数形の種類が拡張されて増える可能性を踏まえて、ユニークな名前を付ける配慮があるのだと思います。
DOM 上で「単語の末尾に s
を持つプロパティ/メソッド」には次のものがあります。
- getElementsByTagName (HTMLCollection を返す)
- Node#childNodes (HTMLCollection を返す)
- HTMLFormElement#elements (HTMLFormControlsCollection を返す)
これもいろいろと「決め打ち」しているからできる事です。
- 同様の「他の複数形式(NodeList等)で返す」機能が存在しない
- 返り値を決め打ちしている
コーダは名前からではなく、仕様書から各APIが持つ返り値を確認する必要があります。
new 演算子で生成されるオブジェクトの変数名
原則としてコンストラクタから生成されるオブジェクトはコンストラクタ名を反映したものであるべき、と考えています。
JavaScript
1var object = new Object;
2var array = new Array;
3var map = new Map;
ただし、new Object
, new Array
だけは例外で、この2つは利用用途が広範で要素の中身が重要な為、コンストラクタ名だけでは「内容を表す名前」として不十分であり、要素に準じた名前を付けるようにしています。
また、DOMの要素ノード系も省略形を使う事が多いですね。
JavaScript
13
4var htmlParagraphElement = document.createElement('p');
5
68
9var p = document.createElement('p');
DOMの Interface 名を基にするなら、HTMLParagraphElement
に準じた名前にすべきですが、名前が長すぎるので tagName
準拠の名前にしています。
更新履歴
- 2017/11/19 13:11 「変数名の末尾にsを付ける命名規則の是非」「new 演算子で生成されるオブジェクトの変数名」を追記
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/18 14:42
2017/11/18 22:50
2017/11/18 23:16
2017/11/19 00:13 編集
2017/11/19 04:13 編集
2017/11/19 11:38
2017/11/19 16:08
2017/11/20 13:53
2017/11/20 14:39