[和訳]クリーンなコードを書くプログラミングを実践する

Nityesh Agarwal    
Build to Learnで、プログラミングを教えるソフトウェア開発者・フリーランスライター
この記事は、2019年11月に公開された記事の翻訳転載です。著者の許可を得て配信しています。
Writing Clean Code and the Practice of Programming

一般的に初心者が無視するより良いプログラミングのための簡単なルール

「スタイルの目的は、コードを自分や他の人が読みやすくすることであり、優れたスタイルは優れたプログラミングに不可欠である。
ブライアン・W・ケニンハン「プログラミングの実践」

プログラミングを独学で習得する場合、誰もその仕事をチェックしていないので、容易に悪い習慣やスタイルが身に付くことになります。これらの問題に直接取り組む書籍や研修コースは多くないことから、クリーンなコードの基準に関する参照資料はあまり多くは存在しません。

この記事では、クリーンで美しいコードを書くことに関する実用的なアドバイスを提供しようとするものです。

シンプルで実用的な優れたプログラミング手法5選

1. 変数の名前を選択する際は、その名前に何らかの意味を込めること

「説明的な名前にすべきか、それとも適当なもので片づけるか?」

これは、新しい変数を作成する際に直面する難問です。

ここでは、下記ライアンWカーニガンのアドバイス(上記の書籍)はここで実際に役に立つと思われます。

・グローバル関数、クラス、および構造体には、プログラムでの役割を示すわかりやすい名前を付ける必要があります。
・対照的に、ローカル変数には短い名前で十分です。関数内の変数は、n で十分、これをnumberofPoints とするのはやり過ぎです。
・従来の方法で使用されるローカル変数の名前は、極めて短くすることができます。ループインデックスには i と j、ポインタには p と q、文字列には s と t を使用する頻度が非常に高く、これらに長い名前を付けてもメリットはほとんどなく、おそらくはロスになります。

とにかく、ブライアンがこの本を書いた90年代よりもずっと良くなっています-それは変数をオートコンプリートにするIDEに似ています。

これでも、適当に片づけますか?

2. 必要に応じて新しい関数を作成

好きな言語で書かれた関数の構文を理解するのは簡単です。しかし、コードを関数に分割するタイミングを学ぶには、練習とある種のデザイン感覚が必要です。

1つの目標として、プログラムを新しいケースに拡張する際は、関数が再利用できるように設計することです。

そのほかに何かありますか?このようなデザインの選択工程は、プログラミングの楽しさでもあります。

このことに関し、ボブマーティンの著書「Clean Code」では、選択肢として下記3つのヒューリスティックを挙げて説明がなされています。

関数は小さくする必要があります。どれほどに小さく?スクリーンに収まる程度内または20行以下。
関数にはわかりやすい名前を付けます。関数は小さければ小さいほど、またその焦点が狭ければ狭いほど、わかりやすい名前を選択しやすくなります。名前を長くすることを恐れてはいけません。長いわかりやすい名前は、短い謎の名前よりも優れています。長いわかりやすい名前は、長いわかりやすいコメントよりも優れています。
関数は1つのことをするだけで、副作用はありません - 関数が意図するところは、その名前によって明確にする必要があります。

最初の関数を書く場合、それはおそらく長く複雑で、上記のルールのいずれにも沿わないものになるでしょう。それで結構です。後でコードを調整して再フォーマットできます。上記すべてのルールに沿った関数を最初から書けるような人はいなと思います。

あなたが目指して努力すべきは目標は関数の構築であることを覚えておいてください。目標を見失ってはさせてはいけません。

3. コードを文書化し、役立つコメントを書く

コードには常に、関数とモジュールドキュメントとして機能するコメントを含める必要があります。

すべての関数定義は、下記のようなコメントを使って処理する必要があります。

1. 関数の動作を記述する1~2語句の短文。
2. その末尾に、その関数が取るすべての引数(存在する場合)の説明文1 行が続きます。
3. その更なる末尾に、関数の戻り変数(存在する場合)の説明文1 行が続きます。

これらとは別途、コードの理解し難い部分を説明するコメントを含める必要があります。

以下のことに留意してください。

・これらコメントは、プログラムの読者を助けることを目的とするものです。コードが既に明白なことを言ったり、コードと矛盾したり、精巧なタイポグラフィーの表示で読者の気をそらしたりするコメントは役立ちません。
・可能な限り、わかりやすいコードを記述しましょう。これを行うに上手であればあるほど、必要なコメントは少なくなります。良いコードは、良くないコードのように多くのコメントをしません。とどの詰まり、コメントは必要悪なのです。
・コメントがコードと矛盾してはなりません。ほとんどのコメントは、書き込み時点ではコードに同調していますが、バグが修正され、プログラムが進化するにつれて、コメントは元の形式のままになることが多く、コードとの不一致が生じます。

4. 一貫性を維持しましょう。

その理由は?

一貫性のあるコーディング スタイルは即ち、優れたコーディング スタイルであるからです。

この一貫性により、 (あなた自身を含む) 誰もが、あなたのコード潜入するのが容易になるので、そのコードを将来的に読み取りやすいものにします。

以下の点を留意しましょう。

・可能な限り、標準的な方法に従ってください。「<プログラミング言語を挿入> スタイル ガイド」を検索し、コード全体で信頼できるソースに従います。Python 自体が推奨する Python PEP8 スタイル ガイドを次に示します。
・標準が何であるかが不確かであるか、または標準を逸脱却する必要がある場合は、そうする理由があって、コード全体で一貫して行われていることを確認すべきである。
・変数の名付け方法、コードのインデント方法、関数の文書化方法、および ++i と i++ のどちらを使用するかにまで至って一貫性を保つべきである。

5. コードの破損は(おそらく)自己責任

そしてそれを負うことを学びましょう。

コーディングに取り組む間、その時間の大半は、破損したコードに頭悩まして費やすことになる可能性があります。

このような場合、プログラマ、特にその初心者はその責任をIDE、コンパイラ、環境、または機器に責任を転嫁しようとします。

あなたが、先ずはその欲求不満を抑えて知るべきは、すなわち、その原因はパソコン機器のせいではなく、あなた自身にあるということです。

この問題は、あなたがある一定の手段を講じる場合にのみ、(それがパソコン機器に何らかの問題がある場合でも)その問題を診断してその核心に到達することが可能となるものなのです。

デバッグする方法

1. 友人にコードを説明するか、または下記ラバーダック(rubber-duck)のデバッグ技術を使用してください.

・友人かまたはラバーダックのいずれかを選択する。
・問題のあるコードを開き、ゆっくりと辛抱強く、彼の(/彼女の/その)行に説明する。
・魔法のように、友人(またはラバーダック技術)の助けを借りずにまとわりついている問題を見つける。

2. printステートメントの追加利用

このようなprintステートメントを追加することは正しいデバッグ方法ではありませんが、私には時々信じられないほど効果的なことがあります。この効果は特に、vimのようなテキストエディタを使用して、デバッガを持つ本格的なIDEで作業している場合 (または、デバッガの使用方法を習得するのが面倒な場合)は顕著に現れます。

しかし、IDEデバッガの使い方を学んだら、後戻りはできないということを申し上げておきます。

3.IDEデバッガの利用

デバッガは極めて便利です。しかし、私は愚かしく長時間を費やしてIDEのデバッグ機能を学ぶことはしていません。しかし、お気に入りの IDE でデバッガを使用する方法を学ぶことはお勧めします。信じてください、それはコード破損の痛みに良く効きます。

個人的アドバイス;Pythonは標準ライブラリモジュール (pdb) にデバッガを提供しているので、私はIDEデバッガを使用しています。

ガイドライン原則

結局のところ、プログラミングスタイルの原則に基づくものは、任意のルールや処方箋ではなく、経験によって導かれた常識であることを覚えておいてください。

以下は私がコードをクリーンに維持すべくフォローしている指針4原則です。

1. 「何とか動いている」で妥協しないこと
2. 読み易いように書く-コードは書かれるより読まれることの方がより頻繁
3. 明解であればあるほど良い
4. 上書きは全てのソフトにおいて、悪の根源

これらは、ルールを忘れたり、これらの簡潔なルールの対象外の現実世界で新しい状況に陥ったときに役立ちます。

これら採用により独自のコーディングスタイルを改善する方法

良いコーディングスタイル関する私の直感を述べるについては、下記の書籍2冊を参照してます。

1. ボブマーティンの著書「Clean Code
2. ブラインカニングハムの著書「プログラミングの練習

しかしながら、練習はこれら書物を読むだけでは不十分であることに留意してください。

これらは把握が難しい直感に関わるものですが、自身の直感を開発する最善の方法は、練習を通じ行うものです。

私は以前に、ティーチングスルースモールプログラムアプローチに潜む問題点は、そのアプローチが以下の点に関して否定的、または反することにあると書いています。

・コードのモジュール化に関する方法など、直感を開発する
・関数が、プログラムを新しいユース ケースに拡張する際にに再利用できるような関数の記述方法に対処する
・読み取り可能なコードとコンパクトなコードを記述することのトレードオフについて話し、優れた一貫性のあるプログラミング スタイルの必要性に焦点を当てます。

要約すると、小さなプログラムは、サイドプロジェクトで作業する大規模なプログラムを作成する際に学ぶコアデザインの選択肢を教えてくれません。

したがって、これらの直感を開発する方法は、プロジェクトに取り組むということです。

あなたが興味深いプロジェクトのアイデアを見つける段階で立ち往生している場合であれば、私はあなたをそこから抜け出すのを支援するたためになる記事を書いています。

Fantastic Programming Project Ideas and Where to Find Them (Beginner-Friendly)

そして、あなたにとって、独自のプロジェクトを構築するという考えがまだあまりにも困難に思える場合であれば、私は上記記事の中でプロジェクトの話を通じてあなたの行く道を案内しています。

Advance Your Python Skills by Building a WhatsApp Chat Analyzer

私は教えることに情熱を注いでいます。私自身が直面する問題に、感情移入を以て取り組むような記書き続けるつもりです。このようなガイドや記事を更新のたびに手に取って読んで頂くべくは、ニュースレター、Build To Learnを購読してください。


コメントを読む

新着ピック  






















新着ニュース

AWS WAFV2でIPアドレス制限してみた | Developers.IO

ハードウェアスタートアップがクラファンで音楽制作に新鮮な息吹を吹き込む | TechCrunch Japan

サーバーレス開発モニタリングのEpsagonが17億円超を調達 | TechCrunch Japan

「iPad(第7世代)」向けケース・カバーの選び方とおすすめ製品3選【2020年最新版】

AWS Backupに新機能 EC2インスタンスをEBSごとバックアップ/リストア可能に クロスリージョンにも対応

AIを活用した観光タクシーの相乗りサービス--JR東日本子会社ら新潟で実証実験

[レポート] 冗長化、永続化、ログ… Prometheus を拡張するエコシステムについて Meetup で聞いてきた #prometheustokyo | Developers.IO

NTTデータ、レジ無しデジタル店舗出店サービス「Catch&Go」を強化

日本発の地質時代「チバニアン」誕生 国際地質科学連合が正式決定

Chromeブラウザに統合メディアコントロール機能が加わる | TechCrunch Japan

昆虫食スタートアップのエリーが東京・表参道に蚕バーガー店をオープン | TechCrunch Japan

[レポート] 15分以内にデータベースを使用したフルスタックのWebアプリケーションを作成する #Workshop #DAT330 #reinvnet 2019 | Developers.IO

PayPay、金融サービス参入へ 後払い、保険、ローン、投資など年内にも開始 “スーパーアプリ化”へ準備着々

非テック企業がCESで注目を集めた理由 パワードスーツだけじゃないデルタ航空のイノベーション

12月の楽天モバイル通信障害、全回線の2割に影響 原因は「デッドロック」

ファミマが「第2回うまいパン決定戦」を開催 山パンがむき出しにした「全国制覇」の野望

映像から複数人の激しい動きを解析、東大とドコモが技術開発 ディープラーニング活用

AR謎解きゲーム「PSYCHO-PASS サイコパス 渋谷サイコハザード」が1月21日より開催 | TechCrunch Japan

「LiVR」でAKB48グループの劇場公演をVRライブ配信--“超神席”で鑑賞可能に

Alphabetが初の時価総額1兆ドル超え、投資家はサンダー・ピチャイがお気に入り | TechCrunch Japan

もっと見る
記事をPICKする
会員登録
Register
記事をPICKする

会員登録すると、もっと便利に利用できます。