こんにちは!
ナビゲータのEVEです。
PHPのコンストラクタでエラーが発生した場合の対応をしています。この手のシステム全体に影響を及ぼす修正は、短期間で一気にやって、後悔したことがたびたびあったので、今回は、少しずつ段階を踏んで実施しています。
昨日はString Classのコンストラクタにエラーロジックを追加し、本日は、同修正の影響とその洗い出し、そして修正までを実施しました。
実施してみて、多分いけるんじゃないかなっていう印象を持っています。今日一日再度検討し、問題ないと判断できた場合、明日一気に全てのクラスの見直しに入りたいと思います。
[カプセル化]
昨日のロジックにおいて、カプセル化という話が出てきました。本日は、その解説をすることにします。
カプセル化には、教科書等で見かけるのは、プロパティ、メソッドのカプセル化です。私は、プロパティのカプセル化をよく利用するのですが、どのような機能なのか、カプセル化について、ChatGPTに聞いてみました。
カプセル化(Encapsulation)**は、オブジェクト指向プログラミング(OOP)の基本的な概念の一つで、データやメソッドを外部から隠蔽し、外部のコードがオブジェクトの内部状態を直接変更できないようにする技術です。カプセル化は、主にプロパティとメソッドで利用され、以下のような特徴やメリットがあります。
❶プロパティにおけるカプセル化
プロパティ(クラスの内部データや状態)は、通常、privateやprotectedといったアクセス修飾子を使ってカプセル化されます。これにより、外部から直接アクセスできないようにします。
1)実装方法:
・private プロパティはクラス内でしかアクセスできません。
・protected プロパティはクラス内および継承したクラス内でのみアクセスできます。
・プロパティへのアクセスは、通常、publicなゲッター(getter)とセッター(setter)メソッドを通じて行われます。
2)メリット:
・データ保護
外部のコードがクラス内部のデータを不正に変更するのを防ぎ、データの整合性を保ちます。
・変更の柔軟性
クラスの内部実装を変更しても、外部に公開されたインターフェースを変更しなければ、他のコードへの影響を最小限に抑えられます。
・制約の管理
ゲッターやセッターを使ってデータのバリデーションや制約を容易に実装でき、データが常に正しい形式を保つようにできます。
❷メソッドにおけるカプセル化
メソッド(クラスの振る舞い)は、必要に応じてprivateやprotectedとしてカプセル化されます。これにより、外部から呼び出されることを防ぎ、クラスの内部処理を隠蔽します。
1)実装方法:
・private メソッドはクラス内でしか呼び出せません。
・protected メソッドはクラス内および継承したクラス内でのみ呼び出せます。
・外部に公開する必要があるメソッドは、publicとして定義されます。
2)メリット:
・内部処理の隠蔽
クラスの内部処理を外部から隠すことで、クラスの使い方を単純化し、内部ロジックの変更が外部に影響を与えにくくなります。
・再利用性の向上
クラスを使う側は、公開されたインターフェース(publicメソッド)を利用するだけでよく、内部の詳細に依存しないため、クラスの再利用性が高まります。
メンテナンスの容易化: クラスの内部実装を変更しても、外部のコードに影響が少ないため、メンテナンスが容易です。
■まとめ
カプセル化は、ソフトウェアのモジュール性、保守性、データ保護、再利用性を向上させる重要な技術です。プロパティやメソッドを外部から隠蔽し、アクセスを制限することで、オブジェクトの内部状態を安全に保ちながら、システム全体の複雑さを管理しやすくします。
メソッドについては、第三者が利用することにより不都合な機能を提供したことがないので、そのメリットがいまいちピンとこないのですが、強いて言うなら、変更してほしくないデータがあったら、そのデータの内容を変更するような機能のメソッドをカプセル化することがあるかもしれません。
ただ、昨日プログラムを作っていて気づいたのですが、もし、本当に変更してもらいたくないプロパティがあったとしたら、定数としたほうがいいかもしれません。定数として設定した以降は、変更できませんが、そんな方法があることを、昨日のChatGPTとの対話で感じました。
なお、以上の解説はJavaの解説となっています。オブジェクト指向言語のカプセル化について解説を依頼したのですが、オブジェクト指向言語の代表的な言語としてJavaについて解説をしているようです。
JavaScriptでは、何も付けなければpublicだし、#を付けた場合は、private扱いになります。但し、protecedはありません。
[それ以外のカプセル化]
プロパティとメソッドのカプセル化について、理解できましたでしょうか?それについては、教科書等に書かれていてよく見かけるものです。自分の記憶では、その2つの記憶しかないのですが、もしかしたら、その他のカプセル化があるかもしれません。ちょっと、ChatGPTに聞いてみましょう!
❶クラスそのもののカプセル化
クラス自体をカプセル化することで、そのクラスを外部から見えなくすることができます。これは、他のクラスやコードが特定のクラスに直接アクセスするのを防ぎ、そのクラスのインスタンス化や利用を制御する場合に役立ちます。
1)実装方法:
internalやpackage-privateなどの修飾子を使ってクラスのアクセス範囲を制限できます。(例:Javaのpackage-private、C#のinternal)
クラスを別のクラスや名前空間(ネームスペース、パッケージなど)内で定義し、その範囲内でのみ利用可能にすることができます。
2)メリット:
・モジュールの保護
クラスが定義されているモジュールやパッケージの外部からそのクラスにアクセスできないようにすることで、モジュール間の依存を減らし、モジュールの独立性を保ちます。
・複雑さの管理
クラスを隠蔽することで、コードの複雑さを軽減し、システム全体の理解と管理を容易にします。
❷インターフェースのカプセル化
クラスが実装するインターフェースもカプセル化の対象となることがあります。特に、クラスが複数のインターフェースを実装している場合、必要なインターフェースのみを外部に公開し、それ以外を隠蔽することができます。
1)実装方法:
インターフェースの公開範囲を制限し、必要なインターフェースのみを外部に公開します。
クラスを特定のインターフェースにキャストすることで、そのインターフェースのメソッドのみを利用可能にすることができます。
2)メリット:
・柔軟な設計
必要な機能だけを公開し、他の実装詳細を隠すことで、柔軟で拡張性のある設計が可能になります。
・依存の削減
外部コードが特定のインターフェースにのみ依存するようにすることで、クラスの変更が外部に与える影響を最小限に抑えることができます。
❸名前空間(ネームスペース)のカプセル化
名前空間(またはパッケージ)は、クラスや関数、変数などのグループをカプセル化するための手段として利用されます。これにより、名前の衝突を避け、コードの整理がしやすくなります。
1)実装方法:
名前空間やパッケージを使って、コードを論理的にグループ化します。
特定の名前空間内に定義された要素のみを外部に公開し、それ以外を隠蔽します。
2)メリット:
・名前の衝突回避
異なるモジュールで同じ名前のクラスや関数を使用でき、名前の衝突を防ぎます。
・コードの整理
大規模なプロジェクトでコードを整理し、特定の機能やモジュールに関連する要素をグループ化することで、コードの理解とメンテナンスが容易になります。
★まとめ
カプセル化は、プロパティやメソッドだけでなく、クラス全体、インターフェース、名前空間などにも適用されます。これにより、システムの複雑さを管理しやすくし、コードの安全性、保守性、再利用性を向上させることができます。
ありましたね・・・。実装方法はイメージがわかないのですが、脳裏にとどめておいて必要に応じて利用したいと思います。
[あとがき]
記憶とは、使用しないと経年劣化といったらいいのでしょうか?変質すると言われています。もしかしたらと思い、調べてみましたが、プロパティとメソッドについては、記憶通りでした。そして、本日新たな知識を得ることができました。
ブログを書くという機会を利用し、今後も知識の確認と最新化をしていきたいと感じた本日の調査でした。
では、また!