こんばんは、エリ狐です。
ちょこっと前編をアップした時より時間が経ってしまいました…。
前回はプログラミングに置いて美しいソースの3ヶ条をお話しました。
前回をチェックしていない…忘れちゃった!という方は…【プログラミング】美しいソースと汚ねぇソースの違いとは?【前編】をチェック!
今回は「美しいソースと汚ねぇソースの違いとは?の後編」です。
前半部分のおさらい
- 複数のコードブロックで類似処理があったら、シルエットも同じようにする
- コード列を整理すれば、全体の概要がわかりやすくなる
- コードの見た目を表面上を改善すると、構造も改善できる
一貫性を持たせることで素早く簡単にソースを読むことができるとお話しました、
今回は美しいソースの3ヶ条のラスト「関連するコードをまとめてブロック化する」についてです。
宣言のブロック化
人間はグループや階層を1つの「単位」として考えます。
コードの概要を素早く把握してもらうには、「単位」を作る必要があります。
次のようなソースを見てみましょう!
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class FrontTestServer { public: FrontTestServer(); void ShowProfile(HttpRequest* request); void OpenDatabass(string location, string user); void SaveProfile(HttpRequest* request); string ExtractQueryParam(HttpRequest* request, string param); void ReplyOK(HttpRequest* request, string html); void SerchFriends(HttpRequest* request); void ReplyNotFound(HttpRequest* request, string err); void CloseDatabase(string location); ~FrontTestServer(); }; |
![](https://eriblog.net/wp-content/uploads/2019/06/pet_maigofuda_dog-272x300.png)
![エリ狐](https://eriblog.net/wp-content/uploads/2019/05/D0807A18-1A80-4D7F-BF8D-40AD8AD9686F-211x300.png)
このように特にひどいコードではありませんが…
メソッドの概要をすぐに把握できるような配置にはなっていない。
このような場合には、全てのメソッドを1つの大きなブロックにまとめるのではなく、論理的なグループに分けてあげると良いでしょう。
例えば…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class FrontTestServer { public: FrontTestServer(); ~FrontTestServer(); // ハンドラ処理 void ShowProfile(HttpRequest* request); void SaveProfile(HttpRequest* request); void SerchFriends(HttpRequest* request); // リクエスト クエリ string ExtractQueryParam(HttpRequest* request, string param); void ReplyOK(HttpRequest* request, string html); void ReplyNotFound(HttpRequest* request, string err); // データベース クエリ void OpenDatabass(string location, string user); void CloseDatabase(string location); }; |
プログラムの概要が把握しやすくなったと思います!
![](https://eriblog.net/wp-content/uploads/2019/05/エリ狐さん指立て-211x300.png)
コードの行数は増えてしまったが、ずっと読みやすくなります。
このようにグループ単位に分けることにより、後に修正や改造をする際にコードを理解するまでの時間がかなり短縮できます。
コードを段落に分けること
![](https://eriblog.net/wp-content/uploads/2019/05/エリ狐さん指立て-211x300.png)
![](https://eriblog.net/wp-content/uploads/2019/06/pet_maigofuda_dog-272x300.png)
![](https://eriblog.net/wp-content/uploads/2019/05/エリ狐さん指立て-211x300.png)
なぜか…
- 似ている考えをグループにまとめて、他の考えと分けるため
- 視覚的に読んでいる場所をわかりやすくする
- 段落単位で読み飛ばしができる
例えば次のようなコードは誰も読む気が起きないでしょう…
1 2 3 4 5 6 7 8 9 10 11 |
def suggest_new_persons(user, email_password): persons = user.persons(); person_emails = set(p.email for p in persons) contacts = improt_contacts(user.email, email_password) contact_emails = set(c.email for c in contacts) not_person_emails = contact_emails - person_emails suggest_persons = User.objects.select(email_in=not_person_emails) display['user'] = User display['persons'] = persons display['suggest_persons'] = suggest_persons return render("suggest_persons.html", display) |
コードを段落に分けると一気に見やすくなります!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def suggest_new_persons(user, email_password): # メールアドレス取得 persons = user.persons(); person_emails = set(p.email for p in persons) # すべてのメールアドレス取込 contacts = improt_contacts(user.email, email_password) contact_emails = set(c.email for c in contacts) # 未登録ユーザーを検索 not_person_emails = contact_emails - person_emails suggest_persons = User.objects.select(email_in=not_person_emails) # ページ表示 display['user'] = User display['persons'] = persons display['suggest_persons'] = suggest_persons return render("suggest_persons.html", display) |
段落ごとに要約コメントを追加しました。
「ちょっと読んでみるかな」ってなると思います。
![](https://eriblog.net/wp-content/uploads/2019/05/エリ狐さん指立て-211x300.png)
このようにコードを分割する方法は色々あります。
長い段落が好きなエンジニアもいれば、短い段落が好きなエンジニアもいます。
ここで大切なのは1つのプログラムで「一貫していること」です。
ここで前編でお話していた「一貫性」と繋がります。
一貫性があることで読みやすく理解にかかる時間が短縮されます。
それこそが「美しいソース」なのです。
前編・後編の総まとめ
プログラミングにおいて、美しいソースを書くために抑えるべきポイントは次の3つです。
- ソースに一貫性を持たせる
- 似ているコードは「シルエット」を似せる
- 関連するコードをまとめてブロック化する
前編・後編をまとめると「一貫性のあるソース」=「美しいソース」ということです。
ソースの「美しさ」意識することで、表面上の改善だけではなく、プログラムの構造も改善することができます。
![エリ狐](https://eriblog.net/wp-content/uploads/2019/05/エリ狐さん指立て-211x300.png)