Clean Code読書ノート8
単純設計四規則:
•Runs all the tests•Contains no duplication•Expresses the intent of the programmer•Minimizes the number of classes and methods(著者が考えている金の鍵)
すべてのテストを実行
低結合高凝集による結果は,より多くのクラスと方法があることである.独立したユニットテストをより簡単に作成できます.
繰り返し不可
重複は重複するコードだけでなく、もちろん他の形式の存在を指す.たとえば
int size() {}
boolean isEmpty() {}
別々に実現できます.
boolean isEmpty() {
return 0 == size();
}
これを見て、少量の繰り返しを見逃さないでください.
public void scaleToOneDimension(
float desiredDimension, float imageDimension) {
if (Math.abs(desiredDimension - imageDimension) < errorThreshold) return;
float scalingFactor = desiredDimension / imageDimension;
scalingFactor = (float)(Math.floor(scalingFactor * 100) * 0.01f);
RenderedOp newImage = ImageUtilities.getScaledImage(
image, scalingFactor, scalingFactor);
image.dispose();
System.gc();
image = newImage;
}
public synchronized void rotate(int degrees) {
RenderedOp newImage = ImageUtilities.getRotatedImage(
image, degrees);
image.dispose();
System.gc();
image = newImage;
}
再構築後:
public void scaleToOneDimension(float desiredDimension, float imageDimension) {
if (Math.abs(desiredDimension - imageDimension) < errorThreshold)
return;
float scalingFactor = desiredDimension / imageDimension;
scalingFactor = (float) (Math.floor(scalingFactor * 100) * 0.01f);
replaceImage(ImageUtilities.getScaledImage(image, scalingFactor,
scalingFactor));
}
public synchronized void rotate(int degrees) {
replaceImage(ImageUtilities.getRotatedImage(image, degrees));
}
private void replaceImage(RenderedOp newImage) {
image.dispose();
System.gc();
image = newImage;
}
大規模な多重化は、小規模な多重化の理解から開始する必要があります.-テンプレートモードTEMPLATE METHOD patternを使用して重複を排除する:
public class VacationPolicy {
public void accrueUSDivisionVacation() {
// code to calculate vacation based on hours worked to date
// ...
// code to ensure vacation meets US minimums
// ...
// code to apply vaction to payroll record
// ...
}
public void accrueEUDivisionVacation() {
// code to calculate vacation based on hours worked to date
// ...
// code to ensure vacation meets EU minimums
// ...
// code to apply vaction to payroll record
// ...
}
}
共通のコードを抽象的な方法で実装し、それぞれの継承クラスでそれぞれの異なるコードを実装します.
abstract public class VacationPolicy {
public void accrueVacation() {
calculateBaseVacationHours();
alterForLegalMinimums();
applyToPayroll();
}
private void calculateBaseVacationHours() { /* ... */
};
abstract protected void alterForLegalMinimums();
private void applyToPayroll() { /* ... */
};
}
public class USVacationPolicy extends VacationPolicy {
@Override
protected void alterForLegalMinimums() {
// US specific logic
}
}
public class EUVacationPolicy extends VacationPolicy {
@Override
protected void alterForLegalMinimums() {
// EU specific logic
}
}