基本概念:
クラスの場合、クラスは1つの責任のみを担当する必要があります。
単一の責任で行うこと:
- クラスの複雑さを軽減します。クラスは1つの責任のみを担当します
- クラスの可読性と保守性を向上させる
- 変更によるリスクを軽減
また注意してください:
ロジックが十分に単純な場合、単一責任の原則はコードレベルで違反できます。
クラス内のメソッドの数が十分に少ない場合は、単一責任の原則をメソッドレベルで維持できます。それ以外の場合は、クラスの単一責任の原則を厳密に遵守する必要があります(責任は複数のクラスに分割されます)。
例:メインカテゴリ、さまざまな車両の操作
public class SingleResponsibility1 { public static void main(String[] args) { Vehicle vehicle = new Vehicle(); vehicle.run("摩托车"); vehicle.run("汽车"); vehicle.run("飞机"); } }
方法1、単一責任の原則が厳密に守られていない
// 交通工具类 // 方式1 // 1. 在方式1 的run方法中,违反了单一职责原则 // 2. 解决的方案非常的简单,根据交通工具运行方法不同,分解成不同类即可 class Vehicle { public void run(String vehicle) { System.out.println(vehicle + " 在公路上运行...."); } }
出力:ここで、飛行機が高速道路を走っていることがわかります。これは間違っています!
ここでのビークルクラスの責任は広すぎるため、異なるビークルは異なる道を進む必要があります。したがって、Vehicleクラスは単一責任の原則に従いません。
したがって、それを修正する必要があります。
方法2:カテゴリを使用して責任を分割し、異なるカテゴリに責任を共有する
//方案2的分析 //1. 遵守单一职责原则 //2. 但是这样做的改动很大,即将类分解,同时修改客户端 //3. 改进:直接修改Vehicle 类,改动的代码会比较少=>方案3 class RoadVehicle { public void run(String vehicle) { System.out.println(vehicle + "公路运行"); } } class AirVehicle { public void run(String vehicle) { System.out.println(vehicle + "天空运行"); } } class WaterVehicle { public void run(String vehicle) { System.out.println(vehicle + "水中运行"); } }
この時、メインクラスを少し変更する必要があります
public class SingleResponsibility2 { public static void main(String[] args) { RoadVehicle roadVehicle = new RoadVehicle(); roadVehicle.run("摩托车"); roadVehicle.run("汽车"); AirVehicle airVehicle = new AirVehicle(); airVehicle.run("飞机"); } }
現時点では、単一責任の原則が厳格に守られています
3番目の方法は、メソッドレベルで単一の責任を監視することですが、クラスレベルで単一の責任を監視することではありません。このクラスの機能は十分に単純なので
注:このメソッドは高度に結合されているため、ここで責任を区別するためにif ... else if ... else ...クラスを使用しないでください。
//方式3的分析 //1. 这种修改方法没有对原来的类做大的修改,只是增加方法 //2. 这里虽然没有在类这个级别上遵守单一职责原则,但是在方法级别上,仍然是遵守单一职责 class Vehicle2 { public void run(String vehicle) { System.out.println(vehicle + " 在公路上运行...."); } public void runAir(String vehicle) { System.out.println(vehicle + " 在天空上运行...."); } public void runWater(String vehicle) { System.out.println(vehicle + " 在水中行...."); } }
メインクラスも少し変更が必要です
public class SingleResponsibility3 { public static void main(String[] args) { Vehicle2 vehicle2 = new Vehicle2(); vehicle2.run("汽车"); vehicle2.runWater("轮船"); vehicle2.runAir("飞机"); } }