良いコード/悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方
サポートページ
この記事を読むのに必要な時間:およそ 0.5 分
ダウンロード
本書のサンプルファイルを圧縮ファイル形式でダウンロードできます。
適宜展開してご利用ください。
(2022年8月8日最終更新)
- ダウンロード
- sample_2022-08-05.zip
補足情報
P.74 5.5.1 プリミティブ型執着の補足
(2022年6月14日更新)
書籍中ではJavaのStringをプリミティブ型執着の一例として上げていますが,厳密にはJavaのStringはプリミティブ型ではありません。
ここでは,プログラミング言語に備え付けの素朴で汎用的な型のことを指しています。
たとえばC#のstring型なども厳密にはプリミティブ型ではありませんが,プリミティブ型執着の対象です。
お詫びと訂正(正誤表)
本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。
(2022年8月31日最終更新)
P.37 3.4.2のオブジェクトに関する説明の部分
誤 | Moenyクラス |
---|---|
正 | Moneyクラス |
(以下2022年6月7日更新)
P.27 3.2.1のリスト3.4
IllegalArgumentException()やNullPointerException()のメッセージの内容がわかりづらいものでした。正しくは下記のようなメッセージが望ましいです。
class Money {
// 省略
Money(int amount, Currency currency) {
if (amount < 0) {
throw new IllegalArgumentException("金額には0以上を指定してください。");
}
if (currency == null) {
throw new NullPointerException("通貨単位を指定してください。");
}
this.amount = amount;
this.currency = currency;
}
}
P.33 3.3のリスト3.18
import java.util.Currency;
class Money {
final int amount;
final Currency currency;
Money(final int amount, final Currency currency) {
if (amount < 0) {
throw new IllegalArgumentException("金額には0以上を指定してください。");
}
if (currency == null) {
throw new NullPointerException("通貨単位を指定してください。");
}
this.amount = amount;
this.currency = currency;
}
Money add(final Money other) {
if (!currency.equals(other.currency)) {
throw new IllegalArgumentException("通貨単位が違います。");
}
final int added = amount + other.amount;
return new Money(added, currency);
}
}
P.39 Column 種類の異なる言語と本書のノウハウにおけるRubyのコード(リスト3.19)
class Money
attr_reader :amount, :currency
def initialize(amount, currency)
if amount < 0
raise ArgumentError.new('金額には0以上を指定してください。')
end
if currency.nil? || currency.empty?
raise ArgumentError.new('通貨単位を指定してください。')
end
@amount = amount
@currency = currency
self.freeze # 不変にする
end
def add(other)
if @currency != other.currency
raise ArgumentError.new('通貨単位が違います。')
end
added = @amount + other.amount
Money.new(added, @currency)
end
end
P.40 Column 種類の異なる言語と本書のノウハウにおけるJavaScriptのコード(リスト3.20)
function Money(amount, currency) {
if (amount < 0) {
throw new Error('金額には0以上を指定してください。');
}
if (!currency) {
throw new Error('通貨単位を指定してください。');
}
this.amount = amount;
this.currency = currency;
Object.freeze(this); // 不変にする
}
Money.prototype.add = function(other) {
if (this.currency !== other.currency) {
throw new Error('通貨単位が違います。');
}
const added = this.amount + other.amount;
return new Money(added, this.currency);
}
P.109 6.2.7のリスト6.39,魔法「紫電」の値オブジェクト導入版のコードの一部
本来変数valueを使うべきところが数値になっていました。
誤 | return new AttackPower(10); |
---|---|
正 | return new AttackPower(value); |
下記のコードも参照してください。
class Shiden implements Magic {
private final Member member;
Shiden(final Member member) {
this.member = member;
}
public String name() {
return "紫電";
}
public MagicPoint costMagicPoint() {
final int value = 5 + (int)(member.level * 0.2);
return new MagicPoint(value);
}
public AttackPower attackPower() {
final int value = 50 + (int)(member.agility * 1.5);
return new AttackPower(value);
}
public TechnicalPoint costTechnicalPoint() {
return new TechnicalPoint(5);
}
}
P.172 8.2.4の脚注10番
誤 | privateに限らす |
---|---|
正 | privateに限らず |
P.215-216 10.2.5のリスト10.1
/** サービス利用料 */
class ServiceUsageFee {
final int amount;
/**
* @param amount 料金金額
*/
private ServiceUsageFee(final int amount) {
if (amount < 0) {
throw new IllegalArgumentException("金額には0以上を指定してください。");
}
this.amount = amount;
}
/**
* サービス利用料を確定する。
*
* @param salesPrice 販売価格
* @param salesCommissionRate 販売手数料率
* @return サービス利用料
*/
static ServiceUsageFee determine(final SalesPrice salesPrice, final SalesCommissionRate salesCommissionRate) {
int amount = (int)(salesPrice.amount * salesCommissionRate.value);
return new ServiceUsageFee(amount);
}
}
P.323 15.2.5の損失の計算
誤 | 単純計算で,開発チーム全体で1日あたり3×20=60時間損失が発生していることになりますね。これが1か月ともなると実働日数20日として120時間,1年間となると1440時間も損失が生じます。 |
---|---|
正 | 単純計算で,開発チーム全体で1日あたり3×20=60時間損失が発生していることになりますね。これが1か月ともなると実働日数20日として1200時間,1年間となると14400時間も損失が生じます。 |
P.351 16.3.3のツール名
誤 | ESlint |
---|---|
正 | ESLint |
P.354 16.4.2の脚注6のURL表記
誤 | Respectful Code Reviewshttps://chromium.googlesource.com/chromium/src/+/HEAD/docs/cr_respect.md |
---|---|
正 | Respectful Code Reviews https://chromium.googlesource.com/chromium/src/+/HEAD/docs/cr_respect.md |
「https://」の前に半角スペースが必要です。
P.379 参考文献の漏れ
下記参考文献が掲載されていませんでした。
『Half baked objects』
著:Kristofer,
URL:https://krkadev.blogspot.com/2010/05/half-baked-objects.html
P.380 索引の表記ミス
誤 | ESlint |
---|---|
正 | ESLint |