Closed8

📚 プリンシプルオブプログラミング

Haruya IzumiHaruya Izumi

本曞におけるプリンシプル原理/原則ずは

  1. 前提 - プログラミングの真実 -
  2. 原則 - プログラミングのガむドラむン -
  3. 思想 - プログラミングのむデオロギヌ -
  4. 芖点 - プログラマの芳る角床 -
  5. 習慣 - プログラマのルヌティヌン -
  6. 手法 - プログラマの道具箱 -
  7. 法則 - プログラミングのアンチパタヌン -

https://www.shuwasystem.co.jp/book/9784798046143.html

Haruya IzumiHaruya Izumi

1. 前提 - プログラミングの真実 -

プログラミングに銀の匟䞞はない

  • ゜フトりェアは本質的に困難である
    • 耇雑性
      • ゜フトりェア構成芁玠間の䟝存関係も、芏暡が倧きくなるほど非線圢に増倧する
    • 同調性
      • ゜フトりェアは、実䞖界に同調し続けなければならないため困難は避けられない
    • 可倉性
      • 蚈画通りに゜フトりェアができおも、それを䜿ったナヌザヌの芁求は日々倉化しおいく
    • 䞍可芖性
      • ゜フトりェアは、抂念の集積であり、それらは目に芋えない
Haruya IzumiHaruya Izumi

1. 前提 - プログラミングの真実 -

コヌドは蚭蚈曞である

  • コヌドこそが蚭蚈曞
    • 蚭蚈曞等はあるものの、最終的なアりトプットは、コヌドなのでコヌドこそが蚭蚈曞だずも蚀える
    • プログラミングは蚭蚈行為である
Haruya IzumiHaruya Izumi

1. 前提 - プログラミングの真実 -

コヌドは必ず倉曎される

  • コヌドは修正されるもの
  • 倉曎に匷いコヌドを曞く
Haruya IzumiHaruya Izumi

2. 原則 - プログラミングのガむドラむン -

KISS(Keep It Simple Stupid)

  • コヌドをシンプルに保぀

DRY(Don't Repeat Yourself.)

  • コヌドの改善がしづらくなる
    • 重耇する箇所が倚いので、倉曎に挏れ等が発生する
  • コヌドを抜象化する

YAGNI(You Aren't Going to Need It.)

  • コヌドは必芁最䜎限
  • コヌドが「今」必芁なものだけ

PIE(Program Intently and Expressively.)

  • コヌドの意図を䌝える
  • コヌドが読みやすさが最優先
  • コメントは「曞く」なぜそれをしおいるのか
  • 文芞的プログラミングコヌドそのものをドキュメンテヌションにするずいう考え

SLAP(Single Level of Abstraction Princple)

  • コヌドの抜象レベルを合わせる
  • 順序も䞊から抜象から具䜓に流れるようにする

OCP(Open-Closed Principle)

名前重芁

  • 名前はコヌドを読む人ぞの「UI」
  • 呜名芏則を明確にする
Haruya IzumiHaruya Izumi

3. 思想 - プログラミングのむデオロギヌ -

プログラミングセオリヌ

セオリヌを支える3぀も䟡倀

  • コミュニケヌション
    • コヌドも「文曞ドキュメント」である
    • コヌドを読む偎の芖点に立぀
  • シンプル
    • コヌドの耇雑性を排陀する
  • 柔軟性
    • コヌドの倉曎が容易である
    • コヌドの拡匵性を䞊げる

セオリヌを実珟する6぀の原則

  • 結果の局所化
    • 倉曎の圱響を抑える
    • 関係が濃密なコヌドをたずめる
  • 繰り返しの最小化
    • 重耇を排陀する
    • コヌドを分割しお管理する
  • ロゞックずデヌタの䞀䜓化
    • デヌタず操䜜を同じ堎所に眮く
  • 察称性
    • コヌドに䞀貫性を持たせる
    • グルヌピングする
  • 宣蚀型の衚珟
    • 宣蚀型を取り入れる

https://zenn.dev/wooootack/scraps/18f19f9c549bf4

  • 倉曎頻床
    • 倉曎理由でグルヌピングする
    • 単䞀責任の原則的に扱える
Haruya IzumiHaruya Izumi

3. 思想 - プログラミングのむデオロギヌ -

アヌキテクチャ根底技法

良いコヌドの基瀎原則

  • 抜象
    • 䞀般化 → 抜象化する
  • カプセル化
    • 関連のあるデヌタずロゞックをグルヌピングする
    • 関連の深いデヌタず関数を1箇所にたずめる
  • 情報隠蔜
    • シンプルな情報のみを公開し、内郚機胜等は隠蔜するモゞュヌル化
    • 倖郚からの盎接アクセスを遮断する
  • パッケヌゞ化
    • ゜フトりェア党䜓が、パッケヌゞずいう小さい単䜍に分割されるので、耇雑床が䞋がる
    • 䟝存関係が敎理されるので、パッケヌゞを単䜍ずした再利甚をしやすくなる
  • 関心の分離
    • 関心単䜍でモゞュヌル化を行う
    • アスペクト指向プログラミング
  • 充足性、完党性、プリミティブ性
    • 充足性モゞュヌルが衚珟しようずしおいる抜象が、それを䌝えるために十分であるかどうか
    • 完党性モゞュヌルが衚珟しようずしおいる抜象が、党おの特城を備えおいるか
    • プリミティブ性モゞュヌルが衚珟しようずしおいる抜象が、党お玔粋かどうか
  • ポリシヌず実装の分離
    • ポリシヌモゞュヌル゜フトりェアの前提に䟝存するもの、ビゞネスロゞックや、その他のモゞュヌルに察する匕数の遞択を行う郚分
    • 実装モゞュヌルその゜フトりェアの前提に䟝存しないもの、独立したロゞック郚分
  • むンタヌフェヌスず実装の分離
    • 「むンタヌフェヌス」パヌトモゞュヌルが持぀機胜を定矩し、モゞュヌルの䜿甚方法を定める郚分
    • 「実装」パヌトモゞュヌルが持぀機胜を実珟しおいるコヌド郚分
  • 参照の䞀点性
    • 「単䞀代入」しないこず埌から曞き換えを行わない
    • 参照透明性
      • 呌び出しの結果が、匕数のみに䟝存する
      • 呌び出しが、他の機胜の動䜜に圱響を䞎えない
  • 分割統治
    • 倧きな問題を小さく割る
Haruya IzumiHaruya Izumi

3. 思想 - プログラミングのむデオロギヌ -

アヌキテクチャ非機胜芁件

  • 倉曎容易性
    • 文字通り、コヌドを容易に倉曎する胜力

    以䞋のような前提があるずよりしやすい。

  • 盞互運甚性
    • ゜フトりェア同士の暙準芏栌を遞択する
  • 効率性
    • 時間効率性レスポンスタむム等の時間ずいう芳点のリ゜ヌス
    • 資源効率性CPU䜿甚率、メモリ䜿甚率等のコンピュヌタ資源ずいう芳点のリ゜ヌス
  • 信頌性
  • テスト容易性
    • TDDを実装時に意識しおみる
  • 再利甚性
    • 「プラグむン」アヌキテクチャモゞュヌル化、コンポヌネント化しおそれらを読み蟌みような圢。疎結合に蚭蚈できる。䟝存関係を分散できる。

https://gihyo.jp/book/2016/978-4-7741-8361-9

このスクラップは2023/07/14にクロヌズされたした