静的メソッドを持つ静的クラスはSOLIDと見なされますか?


27

SOLIDには、 「プログラム内のオブジェクトは、そのプログラムの正確性を変更することなく、サブタイプのインスタンスで置き換えられるべきである」という概念を持つLiskov置換原則が含まれています。

静的メソッド(Mathクラスに少し似ている)を持つ静的クラスにはインスタンスがまったくないため、静的メソッドを持つ静的クラスがある場合、システムはSOLIDと見なされますか?


この質問は素晴らしいと思います。コミュニティが提供するものを見てみましょう。
サイードネアマティ

1
Mathクラスには状態は含まれません。したがって、このタイプのオブジェクトを実際に渡すことはありません。ですから、これがどのように関連するのかわかりません。
マーティンヨーク

静的クラスは純粋なSOLIDとは言えないと思いますが(既に述べたのと同じ理由のいくつかのために)、DRY原則の優れた支持者でありツールであると考えます。
dreza

2
どうして?私の経験から、静的クラスの過剰使用は、ほとんどの場合、1つのグローバルな静的godオブジェクトを永続的に操作するコードの半分で繰り返し繰り返されることになります。
back2dos

1
共通のコードを提供するために、ユーティリティクラスの観点から考えていると思います。私はそれらが簡単に、そしてしばしば誤用されることに同意しますが、それでも状態が問題ではない一般的なコードをグループ化する有用な手段を提供できると思います
-dreza

回答:


27

LSPは、クラスのインスタンスをメソッドに渡し、メソッドにそのインスタンスで何らかの処理を行わせ、多くの場合何らかの結果を生成することに適用されます。C#では静的クラスのインスタンスを作成できないため、これは静的クラスには関係ありません。

さらに重要なことに、静的クラスはシールされているため、継承できません。これにより、C#に関する限り、あなたの質問は意味がなくなります。

静的クラスは常にLSPに準拠していると言えます。なぜなら、その原則に違反するサブクラスを作成することはできないからです。同じ理由で、静的クラスがLSPに準拠しないと言うこともできます。


Javaでは、静的クラスはわずかに異なります。最上位クラスを「静的」としてマークすることはできません。そのため、C#の静的クラスに類似したユーティリティクラスを作成する場合はfinal、コンストラクタを宣言して非表示にする必要があります。ただし、一度実行すると、C#と同様に動作します。インスタンス化やサブクラス化はできません。として内部クラスを宣言できますがstatic、それはC#の場合と同じことを意味するものではなく、単にネストされたトップレベルクラスを示します。

私の知る限り、この場合、VB.NETはC#とまったく同じように動作します。


他の原則に興味があるかどうかは言及しませんでしたが、完全を期すためにとにかくそれらを含めます。

Sイングル責任の原則:静的クラスは簡単にこの原則に従ってください。
Oペン/クローズの原則:静的クラスが密閉されているので、彼らはこれまで、この原則に従うことができません。
L iskovの置換原理:上記のとおり。
私はインターフェイスの分離の原則インターフェイスします:単一のクラスには適用されませんが、1つの大きな静的クラスをより小さく、より専門的なクラスに分割することは、この原則に従うための一歩です。
D ependency反転原則:それを使用して、任意のクラスは、常に時間に存在するものは何でも、実装に依存しますので、静的クラスは、インタフェースを実装することはできません。したがって、静的クラスはこの原則に違反します。

静的クラスは5つの基準すべてを満たさないため、SOLIDではありません。


ソリッドであるということは、5つの基準すべてを満たさなければならないことを意味するため、それはそれらがソリッドではないということを意味しないのですか?
Pacerier

1
@Pacerierはい。ただし、必要のないクラスを常にSOLIDに押し付けてはいけません。クラスのコンテキストに依存します。それは、ユーティリティクラスか何かだ場合、それはIMO「SOLID」ではないと大丈夫だが、それは特定のドメインの使用量を持っている実際のドメインクラスの場合...
ウェイン・モリーナ

4

私はそのようなクラスをオブジェクト指向として分類しません。したがって、オブジェクト指向設計の原則を満たすことはできません(しようとしてはいけません)。

これらのクラスは、JavaやC#などの言語でクラスの外部にコードを提供できないことに対する単なる回避策です。可能な場合は、オブジェクト指向から利点を得られないため、スタンドアロン関数として定義する必要があります。


クラスの外にスタンドアローンの機能を置くことに同意しません。関連する機能(静的または非静的)を共通名でグループ化する簡単な機能は、読みやすくするのに役立ちます。数学関数は法案に完全に適合します。
ジョジョ

2
@jojo同意しました。クラス外で定義された関数をサポートする言語は、C ++の名前空間など、これらの関数の論理的なグループ化もサポートします。
ギャン別名ゲイリー

2

言語を指定しなかったため、C ++では静的メンバーのみを持つクラス渡すことができ、テンプレートを介してそれらのメンバーにアクセスできるため、静的メンバーのみを持つクラスを置き換えることができます。フォームと呼ばれる「インターフェース」です。


vb.net / c#/ java
Pacerier
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.