ソフトウェア作ってて,最初は一つしかない想定で作るけど,あとから複数出現することになって改修するのが大変,ということがある.
最悪サーバーサイド
もう終了したサービスであったのが,ユーザーは自分のアイテムを飾れる部屋を1つ持てるという仕様だったのが,複数の部屋を切り替えられるようにして,部屋ごとに置けるアイテムのシリーズが変わって,シリーズごとにグリッドの細かさも変わるとか.とにかく大変で,全部のテーブルにあとからシリーズidを持たせたり,クラスメソッドで済んでたのをシリーズidを持つオブジェクトのメソッドにしたり,ORMのItemをRoomに渡すのをやめて,その層とは別に独立した画像合成用のItemとRoomを作ってやり取りするとか,最初からそうなってるときより大変なことになる.
最悪クライアントサイド
クライアントサイドでも同じようなことはあって,HTML内に一つしか出現しない前提で作ってると,idでCSS当てたり,$("#button").clickとかidを使ったJS書いたりして,その後そのパーツが複数出現することになると大変なことになる.idは重複してはいけないので,idやめてclassとかに書き換える必要がある.最初からclassとかで要素探していればこんなことにはならないので最悪.ただidじゃなくてclassになってればいいわけではなくて,$root.find('.button')みたいに,ルートとなる要素から探していく必要がある.最初からそうなっていると良い.
最初一つだけだったものがあとから増殖するかどうか,未来のことは分からないので,一つだけっていう想定をやめないといけない.idで書いてもclassで書いても手間変わらないので,そういうところは最初から気をつけるべき.作り終わって完成して終わりならそれでいいけど,10年後も機能追加するような場所では,将来変更しにくくなるようなコードを書いてはいけない.とはいえ,一つに制限することで仕様が簡単になったり,素早く作れたりすることもあるので,どこまでめちゃくちゃにならずに簡素に作れるか,チキンレース感ある側面もある.
ちょっとまし
最近は,GitHubに倣って,JSから触るセレクタは.js-というprefixをつけるようにしてる.もともとは,JSから触ることを示して,CSS設定するためのクラスから独立させるというアイデアだけど,要素が複数になってもよいので,ちょっとまし.
Try to prefix all javascript-based selectors with js-. This is taken from slightly obtrusive javascript. The idea is that you should be able to tell a presentational class from a functional class. Most of the codebase doesn't do this, let's try and move toward it.