私はオブジェクトの概念を理解しており、Javaプログラマーとして、OOパラダイムは実際にはかなり自然に生まれてくると感じています。
しかし最近、私は自分自身が考えていることに気づきました。
ちょっと待ってください、実際に静的クラスを使用するよりもオブジェクトを使用することの実際的な利点は何ですか(適切なカプセル化とOOプラクティスで)。
オブジェクトを使用することの2つの利点を考えることができます(どちらも重要で強力です)。
ポリモーフィズム:実行時に動的かつ柔軟に機能を交換できます。また、システムに新しい機能「パーツ」と代替手段を簡単に追加することもできます。たとえば
Car
、Engine
オブジェクトを操作するように設計されたクラスがあり、Carが使用できるシステムに新しいエンジンを追加したい場合、新しいEngine
サブクラスを作成して、 このクラスのオブジェクトをオブジェクトに渡すだけで済みCar
ます。について何かを変更しCar
ます。そして、実行時にそうすることを決定できます。「機能を渡す」ことができる:システムの周りにオブジェクトを動的に渡すことができます。
しかし、静的クラスよりもオブジェクトに他の利点はありますか?
多くの場合、新しい「パーツ」をシステムに追加するときは、新しいクラスを作成し、そこからオブジェクトをインスタンス化します。
しかし、最近立ち止まって考えたところ、静的クラスは、オブジェクトを通常使用する多くの場所で、オブジェクトとまったく同じように機能することに気付きました。
たとえば、アプリにファイルの保存/読み込みメカニズムを追加する作業をしています。
オブジェクトを使用すると、コードの呼び出し行は次のようになります。 Thing thing = fileLoader.load(file);
静的クラスを使用すると、次のようになります。 Thing thing = FileLoader.load(file);
違いは何ですか?
かなり古いことですが、私は、昔ながらの静的クラスがまったく同じように動作するときに、オブジェクトをインスタンス化する理由を考えることができません。しかし、OOシステムでは、静的クラスはほとんどありません。だから私は何かを逃しているに違いない。
リストした2つのオブジェクト以外のオブジェクトには、他に利点がありますか?説明してください。
編集:明確にします。機能を交換したり、データを渡したりするときに、オブジェクトは非常に便利です。たとえば、メロディーを構成するアプリを作成しました。MelodyGenerator
異なる方法でメロディーを作成するいくつかのサブクラスがあり、これらのクラスのオブジェクトは交換可能でした(Strategyパターン)。
メロディーもオブジェクトを渡すことができたので便利です。コードとスケールもそうだった。
しかし、システムの「静的な」部分についてはどうですか?それは渡されません。たとえば、「ファイルを保存する」メカニズムです。静的クラスではなくオブジェクトに実装する必要があるのはなぜですか?
FileLoader
ソケットから読み取るものと交換する必要がある場合はどうなりますか?またはテスト用のモック?または、zipファイルを開くものですか?
System.Math
.NETは、静的クラスとしてより意味のあるものの例です。それをスワップアウトしたり、模擬したりする必要はなく、論理的にインスタンスの一部となる操作はありません。あなたの「節約」の例がその法則に合うとは本当に思えません。
Thing
ですか?