これは series です。作者は、オブジェクト指向プログラミングでは状態が維持されるため、単体テストを書くのは難しいと述べています。彼はまた、関数型プログラミングは(常にではない)状態を維持しないので、単体テストを書く方が簡単だとも言っています。この問題を示す例は見当たりませんでした。これに該当する場合、オブジェクト指向プログラミングと関数型プログラミングの単体テストを比較する例を教えていただけますか?
オブジェクト指向プログラミングにアプローチする2つの異なる方法を区別したい
経験則として、最初の方法でプログラムされたオブジェクトは、2番目の方法よりも多くのメソッドとvoid
メソッドを持つことになります。フライトシミュレータを作成して、飛行機のクラスを設計するとします。私たちは次のようなものになるでしょう:
_class Plane {
void accelerate();
void deccelerate();
void toggleRightFlaps();
void toggleLeftFlaps();
void turnRudderRight();
void turnRudderLeft();
void deployLandingGear();
void liftLandingGear();
// etc.
void tick() throws PlaneCrashedException;
}
_
これは、おそらく出会うよりも少し極端かもしれませんが、それは全体的に重要です。この種のインターフェースを実装したい場合は、オブジェクト内に保持する必要があります。
モードで記述されたオブジェクトの単体テストを記述することは、次の理由により非常に困難です。
基本的には、ある程度合理的でドメインによく似ているようなインターフェースから始めますが、シミュレーションの素晴らしさで、テストが非常に難しいオブジェクトを作成するようになっています。
ただし、同じ目的を満たすオブジェクトを作成できます。 Plane
をより小さなビットに分割したいと思うでしょう。飛行機の物理的なビット、位置、速度、加速度、ロール、ヨーなどを追跡するPlaneParticle
を用意し、これらを公開して操作できるようにします。次に、PlaneParts
オブジェクトでステータスを追跡できます。 PlanePhysics
とPlaneParticle
を指定すると、新しいPlaneParts
を吐き出す方法を知っている、たとえば、重力によってPlaneParticle
オブジェクトがパラメータ化された、tick()
を完全に異なる場所に出荷します。これはいくつかの例である必要はありませんが、これらはすべて完全に不変である可能性があります。
これで、テストに関して次の利点があります。
これが秘訣です。私が説明した2番目のオブジェクト指向アプローチは、関数型プログラミングに非常に近いものです。おそらく、純粋な関数型プログラムでは、レコードと関数は別々であり、オブジェクトに結合されていません。関数型プログラムは、これらすべてのことを確実にします。単体テストが本当に簡単になると私が思うのは
関数型プログラミングはこれらのことを奨励します(ただし、どのパラダイムでも悪いプログラムを書くことができます)が、オブジェクト指向プログラムでは実現可能です。また、関数型プログラミングとオブジェクト指向プログラミングには互換性がないわけではないことも強調しておきます。