戯言|DI(依存性注入)とAOP(アスペクト指向)

徒然草2.0

プログラミングの再学習メモ。今まで考えてきたことや、コードレベルで工夫していたことにメッシュに名前が付けられている(定義されている)ので(個人的な感想ですが)ややこしいとやや感じています。

Dependency Injection = 依存性注入

  • 依存性=テスト環境や本番の環境で変わるパラメータのこと。
    • 依存物の例
      • データベースの接続処理
      • 外部API通信処理
      • ファイルの読み書き処理
      • メール送信処理
      • ログ出力処理
      • 設定値の読み込み処理
      • 現在時刻の取得
  • DIを考慮したコードは、パラメータを差し替え可能に設計する⇔(1)

※(1) DIではないコードは依存性を外部から注入できるようになっていない=依存性をコード内に保持してしまっている。これをより正確に表現すると「依存先を直接持ってしまっている」「依存物を作ってしまっている」状態という言い方になる。なお、ここで言う依存物とは、オブジェクトやサービスのことである。そうはならず単体テストがしやすいようにする思想・設計が依存性注入であり、昨今のフレームワーク側では当たり前に用いられている。

インターフェースと抽象

  • インタフェース
    • ふるまいの約束(取り決め)
      • 例:パラメータを2つ渡す
  • 抽象
    • 外から見た時のふるまい(実装の具体性を隠すこと)
      • 例:メールを送る
    • 利点
      • 使用する側(クライアントコード)が詳細を意識しなくていい。
        • メリット:使う側が操作に集中できる=呼び出すだけで使える
      • 実装は後で差し替えることも可能
        • メリット:システムの変更に強い
      • 実装部分を独立して開発ができる
        • 分業がしやすい

※プログラミングにおける抽象は関数による抽象化にはじまり様々なレベルでの抽象化がある。MVCモデルやレイヤードアーキチェクチャはアーキテクチャ層による抽象化であり、APIによる外部システムとの連携はサービス層による抽象化である。またORMはDBの抽象化であり、DDDはビジネスロジックの抽象化である。単純に抽象と言うと高度なことに聞こえるが、大規模なシステム開発に限らず様々なレベルでプログラミングをしていれば登場する概念の総称である。

アスペクト指向プログラミング

  • アスペクト指向プログラミング=関心ごとの分離を目的としたパラダイム
    • アスペクトは関心事のこと
    • ビジネスロジックから横断的な関心事(ログ出力、セキュリティ、トランザクション処理、エラーハンドリング)を分離
  • メリット
    • コードをシンプルに保つ
    • コードを柔軟に保つ

アノテーション

個人的にモダンプログラミングの知識が足らないがクラスやメソッドにアノテーションが設定されていることが多々ある。

Javaのアノテーションは言い換えれば属性やメタデータで、コードの実行に直接は影響を与えないものの、コンパイラやフレームワークになんらかの追加情報を伝えるもの。

つまり、アノテーションを見かけたら「これを見たフレームワークはどのように解釈してどんな動きをするのかな?」と気にする必要があるってこと。

Java以外の言語でもPythonであればデコレータ、C#ならアトリビュートなどと呼ばれるもので定義する。PHPには言語仕様上のアノテーションに準じるものがないので、PHP7ではDocBlockと呼ばれるコメントアウトを用いて情報を付与しフレームワークへ指示を与える情報として実装されることがあったが、PHP8には言語仕様としてアトリビュートが定義できるようになった(頭に#を付けて定義する)

アノテーションはクラス、メソッド、プロパティ、フィールドに付与することができる。

フィールドとプロパティの違い

  • フィールド
    • クラス内の構造体が持っている内部変数
    • データメンバとも言う
  • プロパティ
    • フィールに加えてgetterとsetterが付与されたもの

※ひっくるめて変数でよくね?と思うんだけどダメらしい。

オーバーライドとオーバーロード

だんだんプログラミング初心者でも知っている用語で、簡単になっている気がするが完全に忘れているので⋯

  • オーバーライド
    • その名前の通りでメソッドを上書きする仕組み
      • 親クラスのメソッドを子クラスのメソッドで上書きする言語仕様
    • メソッド名、引数の構成は同じである
    • 継承(親と子のクラス)がある場合に使用される
  • オーバーロード
    • メソッドは同名だが引数の型が異なるメソッドを定義できる
      • 多態性の実現に必要な言語仕様
    • 多態性(同じメソッドでも振る舞いが異なる)時に用いられる

※疑問:オーバーロードはどんなOPPにもある言語仕様か?

→厳密には違う。C++,C#などC系にはオーバーロードがあるが、PythonやRubyにはオーバーロードがサポートされておらず、引数を可変させて子クラスのメソッドに処理を渡す仕組みにより、オーバーロードと似たような柔軟性を持たせている。

※疑問:JavaやC++ではクラスと同名のメソッドを使用してコンストラクタを定義するが、他の言語では専用の名前を持つコンストラクタメソッドを定義する場合が多いか?

→これはおおむね正しいようだが、この疑問をた出しく発話することに時間がかかった。急にコンストラクタの話題が出てきたが、オーバーライドやオーバロードと言葉がまざっている(汗)自分の頭の中は言語モデルにすべて任せてしまいたい(冷汗)

徒然草2.0
スポンサーリンク
シェアする
gomiryoをフォローする
ごみぶろぐ

コメント

タイトルとURLをコピーしました