コアコードのクリア(第10章クラス)
カプセル化されるべき
パッヶージ
public class Stack {
private int topOfStack = 0;
private List<Integer> elements = new LinedList<Integer>();
public List<Integer> getElements() {
return elements;
}
public int size() {
return topOfStack;
}
public void push(int element) {
topOfStack++;
elements.add(element);
}
public int pop() throws PoppedWhenEmpty {
if (topOfStack == 0)
throw new PoppedWhenEmpty();
int element = elements.get(--topOfStack);
elements.remove(topOfStack);
return element;
}
}
クラスを開発する場合、デフォルトではインプリメンテーションは非表示になり、外部オブジェクトとインタラクティブな部分のみが表示されます.
外部エラーの使用を防止します.
境界で学んだ部分!Map
Stack例
単一責任原則(SRP)
等級が小さい
クラスには責任者が一人いますか。
책임
でサイズを測定します.public class SuperDashboard extends JFrame implements MetaDataUser {
public Component getLastFocusedComponent()
public void setLastFocused(Component lastFocused)
public int getMajorVersionNumber()
public int getMinorVersionNumber()
public int getBuildNumber()
}
「フォーカス・バージョンには2つの責任があります」異なるカテゴリに分ける.
public class Version {
public int getMajorVersionNumber()
public int getMinorVersionNumber()
public int getBuildNumber()
}
単一責任原則(SRP)の重要性
💡 細かい単一レベルがたくさんあれば、大図を理解するのは難しい.
しかし、小さなクラスの多いシステムでも、いくつかの大きなクラスのシステムでも
運転する部品の数があまり違わない.
💡 いくつかの大きなマルチターゲットクラスからなるシステム(変更時)
すぐに知る必要のない事実さえあり、読者を妨げる.
class PaymentService {
public void pay();
public void cancel();
public void getAccount();
public void getAccountHistory();
}
他の小クラスと協力してシステムに必要な操作を実行します.
低結合度、高凝集度
結合度が低いほど凝集度が高くなり、メンテナンス性が向上する。
に質問
ていけつごうど
結合度が低い。
public class TokyoStockExchange {
public Money currentPrice(String symbol);
}
public class Portfolio {
private TokyoStockExchange tokyoStockExchange;
public Portfolio(TokyoStockExchange exchange) {
this.tokyoStockExchange = tokyoStockExchange;
}
}
「Portfolioクラスのテストコードを作成するには...TokyoStockExchange
関数の場合、APIの値は5分ごとに異なる.public interface StockExchange {
Money currentPrice(String symbol);
}
public class TokyoStockExchange implements StockExchange {
public Money currentPrice(String symbol) {
// call API...
}
}
public class Portfolio {
private StockExchange exchange;
public Portfolio(StockExchange exchange) {
this.exchange = exchange;
}
}
StockExchange
およびPortfolio
の結合度は、TokyoStockExchange
インターフェースを介して切断される.public class PortfolioTest {
private FixedStockExchangeStub exchange;
private Portfolio portfolio;
@Before
protected void setUp() throws Exception {
exchange = new FixedStockExchangeStub();
exchange.fix("MSFT", 100);
portfolio = new Portfolio(exchange);
}
@Test
public void GivenFiveMSFTTotalShouldBe500() throws Exception {
portfolio.add(5, "MSFT");
Assert.assertEquals(500, portfolio.value());
}
}
テストの結果はいつも同じです.でも.拡張の可能性が小さい場合は、まず結合し、抽象的にすることができます.
オブジェクトをカプセル化することで、変更したクラスをテストすることもできます.
凝集度が高い。
改める
クラスは簡単に変更できるはずです。
public class Sql {
public Sql(String table, Column[] columns)
public String create()
public String insert(Object[] fields)
public String selectAll()
public String findByKey(String keyColumn, String keyValue)
public String select(Column column, String pattern)
public String select(Criteria criteria)
public String preparedInsert()
private String columnList(Column[] columns)
private String valuesList(Object[] fields, final Column[] columns)
private String selectWithCriteria(String criteria)
private String placeholderList(Column[] columns)
}
更新文を追加する必要がある場合は?
新しいSQLを追加する場合も変更され、既存のSQL文を変更する場合も変更されます.これはOCPに違反します.abstract public class Sql {
public Sql(String table, Column[] columns)
abstract public String generate();
}
public class CreateSql extends Sql {
public CreateSql(String table, Column[] columns)
@Override public String generate()
}
public class SelectSql extends Sql {
public SelectSql(String table, Column[] columns)
@Override public String generate()
}
public class InsertSql extends Sql {
public InsertSql(String table, Column[] columns, Object[] fields)
@Override public String generate()
private String valuesList(Object[] fields, final Column[] columns)
}
public class Where {
public Where(String criteria) public String generate()
}
public clas ColumnList {
public ColumnList(Column[] columns) public String generate()
}
public class Sql {
public Sql(String table, Column[] columns)
public String create()
public String insert(Object[] fields)
public String selectAll()
public String findByKey(String keyColumn, String keyValue)
public String select(Column column, String pattern)
public String select(Criteria criteria)
public String preparedInsert()
private String columnList(Column[] columns)
private String valuesList(Object[] fields, final Column[] columns)
private String selectWithCriteria(String criteria)
private String placeholderList(Column[] columns)
}
abstract public class Sql {
public Sql(String table, Column[] columns)
abstract public String generate();
}
public class CreateSql extends Sql {
public CreateSql(String table, Column[] columns)
@Override public String generate()
}
public class SelectSql extends Sql {
public SelectSql(String table, Column[] columns)
@Override public String generate()
}
public class InsertSql extends Sql {
public InsertSql(String table, Column[] columns, Object[] fields)
@Override public String generate()
private String valuesList(Object[] fields, final Column[] columns)
}
public class Where {
public Where(String criteria) public String generate()
}
public clas ColumnList {
public ColumnList(Column[] columns) public String generate()
}
リファレンス
これらの情報はゼロベースラインクリーニングコード毎月1冊を聞いた後に整理された.
Reference
この問題について(コアコードのクリア(第10章クラス)), 我々は、より多くの情報をここで見つけました
https://velog.io/@coconenne/클린코드-핵심-정리-10장-클래스
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について(コアコードのクリア(第10章クラス)), 我々は、より多くの情報をここで見つけました https://velog.io/@coconenne/클린코드-핵심-정리-10장-클래스テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol