X(Twitter) Zenn GitHub RSS 共有

コーディング

作成日時:2024-08-01以前
更新日時:2024-09-29

WIP.

PIE原則絶対主義

Program Intently and Expressively.
直訳:意図的かつ表現力豊かにプログラミングする。

全てはPIE原則に基づきコーディングを行う。
可読性高く、かつ認知負荷の低いコードを書かなければならない。
読む人間の事を第一に考えなければならない。
確実に意図を相手に伝える。

意図が読み取れないコードは全てクソコード。

CLEAN原則

原則の順守

コーディング原則は順守しなければならない。
但し、納得できる理由を説明できるならば、守らなくてもよい。

DRY原則とOAOO原則

DRY原則 | プログラマが知るべき97のこと

1. 定義と基本概念

DRY (Don’t Repeat Yourself)

OAOO (Once And Only Once)

2. 主な違い

たとえば、DRY はファイルの集合の場所はアプリケーションの中で一箇所に格納されるべきと主張するが、これらのファイルからデータを取り出す処理をアプリケーションの異なる箇所で記述する回数については寛容である。OAOO の原則は、これに対して、ファイルからデータを取得するコードは一度のみ書かれるよう求めるが、アプリケーション内でこれらのファイルを配置する場所が何箇所あるかについては寛容である。

Don’t repeat yourself - Wikipediaより引用。

DRYは「情報が単一の場所にまとまっていること」。
DDD的。

OAOOは「コードの重複が無いこと」。

3. 具体的な適用例

DRY

OAOO

4. 関心事の分離との関係

5. 注意点

説明責任

自分が実装したコードは説明できなければならない。
コピペコードやAIが出したコードも許容するが、説明できないならばそのコードはクソ。
但し、納得できる理由を説明できるならば、守らなくてもよい。

用語の統一

ユビキタス言語を作成しなければならない。
シノニム・ホモニム・表記ゆれはバグとストレスの温床。

DB定義書が存在するならば、そのファイルから物理名と論理名を抜き出し、
コーディングにおいてはそれらを使用するとよい。

「後で直す」は永久に直されない

気付いたならば今すぐ直せ。

コメントは「何故」を書け

何をしているかはコードを読めばわかる。
「何故」が分からなければリファクタリングが面倒になる。

読み取れない情報を書け。

技術

変数名を省略してはいけない

変数名には、その変数の役割や意味を簡潔に表す命名規則を守ることが重要だ。
適切な変数名は、コードの可読性を高め、メンテナンス性を向上させる。

一方で、メソッドが長くなりすぎる場合は、メソッドの抽出を検討する必要がある。
メソッドを小さな単位に分割することで、コードの可読性と保守性が向上する。

メソッドを抽出した結果、メソッド名から連想される内容が変数名に反映されるため、変数名を短くできる。
スコープが短ければ簡易的な変数名でもよい。

高凝集にすれば、変数名を考える手間を省ける。

ク◯コードはク◯コードを生む

認知負荷が上がる。つまり脳のCPUを無駄に使わされるから。
割れ窓理論。

外部ライブラリ

ラップして使用する。
要するにそのライブラリを使用する専用のクラスを作成する。
ライブラリを変更する際の改修が、そのクラスだけで済む。

一種のアダプターパターン。
使用箇所がライブラリに依存するのではなく、使用箇所がライブラリをラップしたクラスに依存する。
依存が多いのはどっち。前者。

変更容易性

関心の分離

意図的な密結合

型による制限

デザインパターン

デザインパターンの一覧 - Wikipedia

GoFの23パターン

生成に関するパターン

構造に関するパターン

振る舞いに関するパターン

FacadeとAdapter(Claude)

目的

Facade: 複雑なサブシステムに対してシンプルなインターフェイスを提供し、使いやすくすることが目的です。
Adapter: 互換性のないインターフェイスを持つクラスを協調して動作させることが目的です。

インターフェイス

Facade: 新しい、シンプルなインターフェイスを作成します。
Adapter: 既存のインターフェイスを別のインターフェイスに適合させます。

複雑さの扱い

Facade: 複雑さを隠蔽します。
Adapter: 複雑さを変換します。

使用場面

Facade: 複数のクラスや複雑なサブシステムを扱う際に使用します。
Adapter: 既存のクラスを新しいインターフェイスで使用したい場合に使用します。

関係するクラス数

Facade: 多くの場合、複数のクラスを扱います。
Adapter: 通常、1つまたは少数のクラスを扱います。

ロックの獲得

ロックの実装はいろいろ。

MVC

よほど大規模でなければ、1API-1Controller-1Serviceでいいと思う。
単一責務の原則。
1ファイルにまとめた場合、Gitだとコンフリクトが多発する可能性。

食べログとか、1エンドポイント1クラスらしい。
Software Design 2024年10月号のP.41

リファクタリング

小さい粒度でコツコツと

CSVで考える事

不変性

recordを使えばprivate finalだけど、アクセスがgetXXXじゃないのがヤダ。

値によってインスタンス切り替え

愚直にifかClass.forName。
分岐はファクトリー内で完結させろ

設計書は必ず腐る

だからコードは自己説明的でなければならない

アクセス不可のメソッドを無理矢理呼ぶ方法

こうすれば外部から不可視なメソッドを外部から呼べる。
良くないけど。
どうしても内部のものを呼びたい時にだけ使用する。

protected int method(){...}
public int wrapper() {
  return this.method();
}