オブジェクト指向プログラミング十戒 1 単機能にする


 

1 単機能にする

クラス名は名詞、メソッド名は動詞+目的語にする。

GetPersonalData.java
public class GetPersonalData { public String name(String id) { // 略 } public String address(String id) { // 略 } }

何をするメソッドかが分かりにくい。

PersonalData.java
public class PersonalData { public String getName(String id) { // 略 } public String getAddress(String id) { // 略 } }

何をどうするメソッドかが分かりやすい。


メソッドに複数の機能を持たせない。クラスやメソッドの名前にそぐわないコードがあるようならば、それはそこに存在してはいけないコードなので、別のクラスやメソッドに分ける。

Person.java
public class Person { private String phoneNumber; private boolean employee; public boolean setPhoneNumber(String number) { if (employee) { // 社員はそのまま設定 phoneNumber = number; return true; // 社員は true } else { // 非社員は 0 を付けて設定 phoneNumber = "0" + number; return false; // 非社員は false } } // 略 }

電話番号を設定するメソッドなのに、社員かどうかの判定もしています。

Person.java
public class Person { private String phoneNumber; private boolean employee; public void setPhoneNumber(String number) { if (employee) { // 社員はそのまま設定 phoneNumber = number; } else { // 非社員は 0 を付けて設定 phoneNumber = "0" + number; } } public boolean isEmployee() { return employee; // 社員は true } // 略 }

電話番号を設定するメソッドと、社員かどうかの判定メソッドを分けます。


同じ情報を操作するメソッドが散在していると、情報の構造変更に対応することが難しくなります。同じ情報を操作するメソッドは同じクラスにまとめます。

Check.java
public class Check { public boolean isValidPhoneNumber(String number) { // 略 } public boolean isEnoughStock(Product p, int c) { // 略 } }
Calculation.java
public class Calculation { public int getTotalAmount(List<Product> list) { // 略 } public int getDiscountPrice(Product p) { // 略 } }

互いに関係の薄いメソッドが一つのクラスに存在しています。

他のクラスから共通の処理を呼び出すことは容易になりますが、関連する処理が散在してしまい、メンテナンスや変更が困難になります。

Phone.java
public class Phone { private String phoneNumber; public String isValidPhoneNumber() { // 略 } // 電話に関する他のメソッド }
Product.java
public class Product { private int stock; public boolean isEnoughStock(int c) { // 略 } public int getDiscountPrice() { // 略 } // 商品に関する他のメソッド }
Sales.java
public class Sales { private List<Product> list; // 売り上げリスト public int getTotalAmount() { // 略 } public void add(Product p) { // 略 } // 売り上げに関する他のメソッド }