汝、SLAPを愛せよ。Blank?=Falseスマートフォン用の表示で見るBlank?=False「呉下の阿蒙にあらず」をモットーにしたITエンジニアの日々Blank?=Falseこの広告は、90日以上更新していないブログに表示しています。2016-11-19汝、SLAPを愛せよ。プログラミングSLAPという言葉があります。Principleの略ですが、DRY,YAGNIと比べると認知度が低く感じます。知ってほしいものなので紹介します。SLAPとは高水準なコードとは低水準なコードとは大切なこと類似したプログラミングの原則メリットどうすればいいの?複合関数とロジック関数(オブジェクト指向ならメソッド)をはっきり分けること複合関数とはロジック関数とはPublicなメソッドで実装の詳細を書かないこと階層構造を考え、ロジック関数から複合関数を呼び出す処理は行わないこと1つの関数が複数の水準を持たないこと階層構造をわかりやすくするためにより上を目指すために最後に参考文献SLAPとはまず、ソースコードは低水準なもの、高水準なものがあります。この水準を揃えたコードを書きましょう、というのがSLAPの基本的考え方になります。全体に動きが俯瞰しやすくなります。高水準なコードとはオブジェクト指向言語であれば、Publicで外部公開されたメソッドがこれにあたります。ボタンをクリックした時にコールされる関数やメソッド等になります。ユーザー側、外部向けのコードというイメージです。低水準なコードとはオブジェクト指向言語であれば、Privateで非公開のメソッドがこれにあたります。実際の処理(ロジック)、計算式、APIの利用やファイルの読み書き、インターフェース等になります。内部的なコードというイメージです。大切なことここで、高水準、低水準と2つを説明していますが、実際のプログラミングを2つの水準に分けることは非常に難しく、むしろ無理に2つの水準に分けた結果読みにくくなってしまうかもしれません。大切なのは水準を作ってそれを揃えることなので、2つだけではなく3つ、4つ、あっても構いません。高水準、低水準ではなくレイヤの階層構造をイメージしてください。以下のように分けていきます。ユーザーの操作を受ける最上位レイヤ最上位レイヤが持つモデルクラスの公開メソッドとなる第2レイヤモデルクラスの公開メソッド内で呼び出される実際の処理の第3レイヤ実際の処理の中で呼び出されるライブラリの関数となる第4レイヤ繰り返しますが、目的は水準を作ってそれを揃えることで、2つの水準にわけることではありません。実装パターンという本では「宣言型の表現」という言葉があり、これはコードを宣言的に書きましょうという原則で、ソースコードはできるだけ条件分岐や繰り返しがない方がわかりやすくなる、ということです。Logic3とします。それを関数にする場合、以下のようにすれば読みやすくなる、ということです。Logic3end個人的にですが、これとSLAPは近いものが有ると思っています。言うと、処理の水準を揃えようとするとそれぞれの水準で別の関数になりますので、それを1つ上の水準で利用すると自ずと宣言型の表現に近い形になると思います。高い水準のボタンクリック時にコールされるイベントでも、チェックボックスがチェックされている・されていないで処理を変える事はあります。endendなのでできるだけ条件分岐、繰り返しを使わないというわけです。メリット高水準で宣言的に書かれた関数が処理の要約となるため読みやすくなる処理の階層が俯瞰でき、構造が理解しやすくなるどうすればいいの?以下の3つを意識すればSLAPに沿ったコードが書けるようになります。複合関数とロジック関数(オブジェクト指向ならメソッド)をはっきり分けること複合関数とは他の関数を呼び出すのみで自分自身は計算式などの処理を関数を集合関数と言います。以下はbar関数とbaz関数を呼び出す複合関数fooの例です。bazendこの複合関数がソースコードの要約として読めるようになります。複合関数はできるだけ宣言型の表現で書くようにすることでよりわかりやすくなります。この複合関数で呼び出す関数・メソッド名はわかりやすい命名にすることが重要です。わかりにくい名前にしてしまうと、要約として意味をなさなくなります。Methodというデザインパターンとなっています。ロジック関数とは実際の処理を書く関数になります。このロジック関数は、1つだけの処理を実装し、複数の処理は実装しないようにします。下の水準のロジック関数を呼び出すことは構いませんが、複合関数は呼び出さないようにします。Publicなメソッドで実装の詳細を書かないことPublicなメソッドは、基本的に集合関数にします。いうと、後から他の所から利用したいと思い、コードを読んだ時に処理の内容を理解しやすくするためです。Publicなメソッドはわかりやすくするため詳細なロジックは書かないようにしましょう。詳細なロジックは隠蔽されたprivateメソッドで書くようにするべきです。階層構造を考え、ロジック関数から複合関数を呼び出す処理は行わないことロジック関数は、関数の階層構造の末端と考えます。ロジック関数から複合関数を呼び出すような処理が必要であれば、そのロジック関数を呼び出す複合関数でその複合関数を呼び出すようにしたほうが階層がわかりやすくなります。ロジック関数で複合関数を呼び出してしまうと、別の水準の関数を使うことになってしまい、階層構造が崩れます。複数の水準をもつことになり次にどうなるかがわかりにくくなります。logic3は1つ下のレイヤの処理で、logic1とlogic2は別の関数で処理しているのにも関わらず,logic3はこの関数内で唐突に下のレイヤの処理が書かれています。言うパターンが1つの関数が複数のレイヤを持つ状態で、ビジネスロジックを追いかけるだけなのに1つ1つの計算式を見なくてはいけなくなります。階層構造をわかりやすくするためにイメージを作りましょう。自分の場合こんなイメージでやってます。慣れてくると自然とこういうイメージが頭に浮かぶようになると思います。上を目指すために各ロジック関数は柔軟に使え、再利用しやすいように部品化しておくことで、他の高レベルレイヤでも使えるようになります。コードの重複を防げるようになるのでDRYなコードになります。最後にソフトウェアが大きくなると、ソースコードの階層構造をしっかり作っておかないと読みにくくなり、メンテナンスが難しくなってしまいます。コードを読む時に要約がないと、読むのに時間がかかってしまいます。ソフトウェアは何年使われるか予測するのが難しく、自分が理解できていても自分がその製品の担当から外れた時に他のプログラマがコードを読んで「誰だこんな読みにくいコードを書いたのは!」と内心怒り心頭になったりします。自分のこと自分が作ったものに対して誰かが怒っていると知ったらちょっと落ち込みますよね。逆にあんな読みやすいコード書いてくれてありがとう!と感謝してたら嬉しくなります。12:40汝、SLAPを愛せよ。Tweet広告を非表示にする関連記事2017-02-06リファクタリングの帽子をかぶるということみなさんこんばんわ。VBAでフォルダの再帰的な作成をしようと...2016-11-22関数、メソッド、プロシージャ。それぞれの違いは?どうもこんばんわ。コントローラとアクション今回は、コントローラとアクションについて学習してきます。»Profile某製造業の社内Sler。今のお仕事のメインはAccessとVBA。元パッケージソフト開発者。VBA、そしてRDBやNoSQLを組み合わせたアプリケーション開発を得意としています。福岡県、もしくは熊本県へIターン転職に向けて、DB/NoSQLの業務に関われる会社を探しています。レベル1取得しましたリファクタリングの帽子をかぶるということ勉強は大変だが役に立つCUIなCentOS7にcinnamonを導入するLinuxのコマンドはMacOSXでそのまま動くとは限らない月別アーカイブTwitterGooglePocketはてなブログをはじめよう!stonebeach-dakarさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。