リーダブルコード
1章 理解しやすいコード
- 優れたコードは、理解しやすいコード
- コードは他人(未来の自分を含む)が最短時間で理解できるように書かなければならない
- コードは短い方がいいが、理解する時間が短くなるように努める
- コードを見たらすぐにリファクタリングするのではなく、「このコードは理解しやすいだろうか?」と自問自答してみる
2章 表面上の改善(名前に情報を詰め込む)
- 名前は短いコメント。名前に情報を詰め込む。
明確な単語を選ぶ
- def GetPage(url)は明確ではない。getという単語があいまいさを持っている。これなら、DownloadPage()の方が明確。
- int size()は明確ではない。目的に適した明確な名前を付けるなら、Height()やNumNodes()やMemoryBytes()などがよい。
- void stop()は、動作に合わせててもっと明確な名前を付けるなら、Kill()やResume()やPause()などもいい。
tmpやretvalなどの汎用的な名前を避ける
これ、考えるのが面倒な時にやってしまいがち。(だがその場しのぎで後々のことを考えていない)
ただし、バブルソートなどで一時的に2つの変数を入れ替えるためのtmpなどは問題ない。tmpという名前で、「この変数にはほかに役割がない」ことを伝えている。
- tmpは、生存時間が短く、一時的な補完が最も大切な変数にだけ使用する。
ループイテレータ
- イテレータが一つだけの場合は、それがイテレータということを示す場合が多いので、特に問題ではない。ただ、2つ以上のfor分を重ねる場合などは、名前を付けると良い。
i,j,kだけではなく、club_i, members_i, users_i など。
ポイント:【tmp, it, retvalなどの汎用的な名前を使うときは、それ相応の理由を用意する】
抽象的な名前よりも具体的な名前を使う
- ServerCanStart()よりも、CanListenOnPort()
- DISALLOW_EVIl_CONSTRUCTORSよりも、DISALLOW_COPY_AND_ASSIGN (悪のコンストラクタを許可しない規約。それよりも、マクロが許可していないものを明確にする方が大切。)
- --run_locallyオプションは、プログラムがデバッグ情報を印字するようになるが、動作は遅くなる。ローカルマシンでテストするときに使用していた。しかし他者から見ると説明を受けるまで用途を勘違いしやすい。--run_locallyのように環境の名前を入れることは良くなく、--extra_loggingという名前の方が直接的。目的に沿った名前にすることが大切。
名前に情報を付ける
値の単位
- 時間やバイト数のように計測できるものだったら、変数名に単位を入れると良い。
startではなく、start_msだと、単位ずれに気づきやすい。 - Start(int delay) : delay -> delay_secs
- CreateCache(int size) : size -> size_mb
- ThrottleDownload(float limit) : limit -> max_kbps
- Rotate(float angle) : angle -> degrees_cw
その他の重要な属性を追加する
すべての変数名をそうしろというわけではなく、意味を間違えてしまったときにバグになりそうなところにだけ使うのが大切。特にセキュリティバグのようなところは使うと良い。
状況 | 変数名 | 改善後 |
---|---|---|
passwordは平文なので、処理する前に暗号化すべき | password | plaintext_password |
ユーザーが入力したコメントは表示する前にエスケープする必要がある | comment | unescaped_comment |
htmlの文字コードをutf-8に変えた | html | html_utf8 |
入力されたデータをURLエンコードした | data | data_urlenc |
名前の長さを決める
スコープが小さい場合は短い名前でもいい
数行のif文だったら、変数名は短くて良い。
頭文字と省略形
新しいメンバーが名前の意味を理解できるなら使用してよい。(=つまりその単語はプロジェクトならではではなくある程度汎用的だということ)
不要な単語は削る
ConvertToString()はToString()にしても意味が通る。DoServeLop()をServeLoop()にしても意味が通る。
名前のフォーマットで情報を伝える
- エンティティごとに異なるフォーマットを使うのはよくやること。
- クラス名はCamelCase(キャメルケース)
- 変数名はlower_separated(小文字をアンダースコアで区切ったもの。スネークケースと言ったりもする)。
プロジェクトで一貫性を持たせる
まとめ
- 明確な単語を選ぶ
- tmpやretvalなどの汎用的な名前を避ける
- 具体的な名前を使って、物事を詳細に説明する
- 変数名に大切な情報を追加する
- スコープの大きな変数には長い名前を付ける
- 大文字やアンダースコアなどに意味を含める
WEB技術の基本
Webとは
- WWW:World Wide Web
- Web上の文書(Webページ)はハイパーテキストという言語で構成されている。
- ハイパーテキストは別のWebページへの参照(ハイパーリンク)を埋め込める。これで全体で大きな情報の集合体を作れる。
インターネットとWeb
- インターネットとWebはそれぞれ別の目的で開発され、のちに融合し普及した。
- CERN(欧州原子核研究機構)が実験データの高速アクセスのためにENQUIREを開発した。それが改良されてWWWが誕生した。
- インターネットはARPAによって開発されたARPANETが原型となっている。当時は接続回線が高価だったが、技術発展で安価になり普及した。
さまざまなWebの用途
- 文書の閲覧:1つのドメインの複数のWebページの集合をWebサイトと呼ぶ。ユーザーはWebブラウザでハイパーリンクをたどり、文書を読む。
- ユーザーインターフェース
- プログラム用API:UIに対し、ソフトウェア同士のやり取りの橋渡しをする機能。スマートフォンのアプリのデータ送信・受診の処理によく使われる。
HTMLとWebブラウザ
- HTML:ハイパーテキストを記述するための言語。
- Webブラウザ:ハイパーテキストを人間が読むのに適するように解釈することが役割。
WebサーバーとHTTP
- 配信プログラム Webサーバー:Webサーバーは、Webブラウザからコンテンツの要求があると、必要なコンテンツをネットワークを通してWebブラウザに送信する。一般的にはApacheやIISがよく利用される。
- やり取りの手順 HTTP:HTTPはプロトコル。環境が違ってもプロトコルは世界共通。
Webページが表示される流れ
- URLを使ってWebサーバーにアクセス:URLには、プロトコル、Webサーバーの指定、コンテンツの指定の情報が入っている。
- Webブラウザで解釈
- ほかの画像などを転送
静的ページと動的ページ
- 静的ページ:何度アクセスしても毎回同じものが表示されるWebページ。研究資料閲覧には静的ページだけで十分だったが、利用用途が拡大されるにつれ豊かな表現が必要になり、動的ページが生まれた。
- 動的ページ:静的ページに対し、アクセスしたときの状況に応じて異なる内容が表示されるWebページのこと。Googleなどの検索サイト、掲示板サイト、ログインを伴う会員サイトなど。
動的ページの仕組み
- CGI(Common Gateway Interface:WebサーバーがWebブラウザからの要求に応じてプログラムを起動させるための仕組み。
- 動的ページを利用する
- WebブラウザはCGIが用意された場所を示すURLにアクセスする
- 要求を受信したWebサーバーでは、CGIによってプログラムが起動。
- プログラムはHTMLファイルを用意し、Webサーバーを通してWebブラウザに送信
- サーバーサイド・スクリプト:CGIから呼び出されるプログラムのこと。スクリプト言語で記述される。
- クライアントサイド・スクリプト:主にJavaScript。
Webの標準化
- 標準化:規格を決める作業のこと
- 標準化を進める団体:W3C(World Wide Web Consortium)
Webの設計思想
- RESTful:RESTの原則に従って設計されたシステムのこと。
- REST:4つの原則からなるシンプルな設計を指す。
- 統一インターフェース:あらかじめ定義・共有された方法で情報がやり取りされる。
- アドレス可読性:すべての情報が一意なURLの構文で示される
- 接続性:やり取りされる情報にはリンクを含めることができる
- ステートレス性:やり取りは1回ごとに完結し、前のやり取りの結果に影響を受けない
- REST:4つの原則からなるシンプルな設計を指す。
- セマンティックWeb:Webページの情報に意味を付け加えたもの。これをすることで、コンピューターが自律的に情報の意味を理解して、処理できるようになることが期待される。セマンティックWebの世界では、HTMLではなくXMLという言語で構成されている。
Webアプリケーション/Webシステム
- Webページ:Web上にある文書を指す
- Webサイト:特定のドメインの下にあるWebページの集まり。表紙はトップページと呼ばれる。
- Webアプリケーション:Webを介して人が利用するサービスを提供する
- Webサービス:Webを介してプログラムが利用するサービスを提供する
- Webシステム:Webサイト、Webアプリケーション、Webサービスを提供するための仕組み。