「味とは美しいものを判断する能力です」
I.カント
Linuxの創設者の1人であるDirk Hondelは、 かつて LinuxのクリエイターであるLinus Torvaldsについて次のように語っています。 Torvaldsは、問題を解決するためのシンプルで合理的な方法を見つけ、「ソート」する方法を知っています。 彼は複雑なことを簡単にします。 私の意見では、これが優秀なプログラマーと優れたプログラマーの主な違いです。」
最近のインタビューで、14分ごろ、Linus Torvaldsが「プログラミングの良い味」のトピックに触れました。 良い味 主催者は彼にこれについてさらに詳しく説明するように頼み、手ぶらで来なかったライナスはいくつかのスライドを見せた。
最初は、プログラミングの悪趣味の例が示されたため、その背景に対して、高品質のコードの利点を確認する方が良いとされました。
プログラミングの悪い味の例
これは、リンクリストからオブジェクトを削除するCで記述された関数です。 10行のコードで構成されています。
Linusは、関数の下部にあるifコントロールに注目しました。 彼が特に不幸だったのはこの断片でした。
ビデオを一時停止し、スライドを注意深く調べました。 最近このようなものを書きました。 実際、Linusは私には悪い味があると言った。 grみを飲み込んだ後、私はビデオを見続けました。
Linusが聴衆に説明したことにはすでに出会った。 つまり、ポイントは、リンクリストからオブジェクトを削除するときに、2つのケースを考慮する必要があるということでした。 最初は、オブジェクトがリストの中央にあるときです。 2番目は、リストの一番上にあるオブジェクト用です。 このアプローチは、if構造の使用を強制し、味のないコードの作成につながります。
しかし、Linus自身が条件付きステートメントを使用する必要性を認識した場合、なぜこのアプローチは彼に適さないのでしょうか?
それから彼は聴衆に2枚目のスライドを見せた。 これは同じ機能の例でしたが、今回は味で書かれています。
プログラミングの良い味の例
前の例で10行のコードで実行されたのと同じことが、今では4行に収まります。
ただし、プログラムテキスト自体の長さは特に重要ではありません。 最初の例の最後に条件演算子が表示されるようになったアプローチは重要です。 新しいコードでは、追加の条件を確認する必要はありません。 コードは、リストの中央からアイテムを削除し、最初のアイテムを削除するために同じアプローチが使用されるように再設計されました。
Linusは新しいコードについて説明し、最も重要なことは境界線の場合を排除し、その後会話が別のトピックに切り替わることだと述べました。
プログラミングの良さについての考察
しばらくの間、例を振り返りました。 ライナスは正しかった。 2番目のスニペットははるかに優れています。 プログラミングの良い味と悪い味を区別するテストであれば、このテストは失敗します。 この不幸な条件なしであなたができるという考えは私の心を決して横切った。 リンクリストをよく使用するので、これを複数回作成しました。
おそらく、上記の例の主な価値は、リンクされたリストからアイテムを削除する良い方法を示していることすらありません。 ここでの主なことは、この例は、あなたが書いたコード、プログラムに散らばった小さなアルゴリズムの実装を、あなたが決して知らなかった方法で改善できると考えるようにすることです。
私の新鮮なプロジェクトのテキストを改訂することに決めたとき、私は特別な注意を払ったのはこの考えでした。 運命かもしれませんが、私のプログラムもCで書かれています。
私が理解している限り、プログラミングの趣味に関する質問の焦点は、条件文としてコードに現れる傾向がある境界線のケースを排除することです。 したがって、チェックする必要のある条件の数を減らすことで、プログラミングの良い味が表現されます。
私のコード改善の成功例についてお話したいと思います。
メッシュの端を好みで初期化する
, , , :
grid[rows][cols]
.
, , – , , .
, , , , , , , , . :
for (r = 0; r < GRID_SIZE; ++r) {
for (c = 0; c < GRID_SIZE; ++c) {
//
if (r == 0)
grid[r][c] = 0;
//
if (c == 0)
grid[r][c] = 0;
//
if (c == GRID_SIZE - 1)
grid[r][c] = 0;
//
if (r == GRID_SIZE - 1)
grid[r][c] = 0;
}
}
, , . , :
- . .
- . , GRID_SIZE 64, 4096 , 256 .
, , , .
- , , for, . , – . 256 , , . , .
for (i = 0; i < GRID_SIZE * 4; ++i) {
//
if (i < GRID_SIZE)
grid[0][i] = 0;
//
else if (i < GRID_SIZE * 2)
grid[i - GRID_SIZE][GRID_SIZE - 1] = 0;
//
else if (i < GRID_SIZE * 3)
grid[i - (GRID_SIZE * 2)][0] = 0;
//
else
grid[GRID_SIZE - 1][i - (GRID_SIZE * 3)] = 0;
}
? . . , . .
, , - . : «, ». , , , , , , , , .
, . . , 64 . .
for (i = 0; i < GRID_SIZE; ++i) {
//
grid[0][i] = 0;
//
grid[GRID_SIZE - 1][i] = 0;
//
grid[i][0] = 0;
//
grid[i][GRID_SIZE - 1] = 0;
}
. . . .
.
?
, , ?
, , - , , , , . , – , . , , , , .
, , , « », , , , , .
, , , . , , , .
, , , , , .
« » ?