書籍概要

ちょうぜつソフトウェア設計入門
――PHPで理解するオブジェクト指向の活用

著者
発売日
更新日

概要

SoftwareDesign誌での連載と技術アドベントカレンダー24回ぶんに収まらなかった関連知識を徹底解説。いわゆる「オブジェクト指向」と呼ばれる考え方から発展した分野は,どのようにソフトウェア設計の役に立つのかを,よく知られた原則,テスト駆動開発,デザインパターンなどを通じて理解できる一冊です。上級者には定番の知識を体系的に整理するヒントとして,初級者には可愛いイラストで覚えるキーワード集として,幅広く活用していくことができます。なお,サンプルコードはPHPで書かれていますが,他の言語に置き換えて読めるコードばかりです。PHPを使っているかどうかを問わず,全ての開発者にオススメです。

こんな方におすすめ

  • ソフトウェア開発にかかわるすべてのエンジニア,PHPプログラマ,Webプログラマ,アーキテクトなど

サンプル

samplesamplesamplesamplesample

目次

第1章 ›› クリーンアーキテクチャ

第2章 ›› パッケージ原則

第3章 ›› オブジェクト指向

第4章 ›› UML(統一モデリング言語)

第5章 ›› オブジェクト指向原則 SOLID

第6章 ›› テスト駆動開発

第7章 ›› 依存性注入

第8章 ›› デザインパターン

第9章 ›› アジャイル開発

サポート

正誤表

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2024年3月25日最終更新)

P.13

誤 管理する方法をを
正 管理する方法を

P.18

誤 おさえさえる
正 おさえさせる

P.22

誤 “Reuse-Release Equivalent Principle(REP)”
正 “Reuse-Release Equivalence Principle(REP)”

P.25

誤 それ意外
正 それ以外

P.28

誤 閉鎖性共通の原則(CCP)加えて
正 閉鎖性共通の原則(CCP)に加えて

P.44

誤 を持ちもます
正 を持ちます

P.53

誤 そうした面をだけを
正 そうした面だけを

P.58

誤 連想でない
正 連想できない

P.66

誤 図4-1 WheelS
正 Wheels

P.70

誤 していると
正 していること

P.73

誤 図4-7 articlePreseneter:ArticlePreseneter
正 articlePresenter:ArticlePresenter

P.74 図4-9

誤 fe^tch
正 fetch

P.74 図4-9

誤 visualised
正 visualized

P.80 図5-1

誤 writer
正 Writer

P.80 図5-1

誤 subscrbe()
正 subscribe()

※UML図の矢印の頭を取る

P.81

誤 Subscrbe()
正 subscribe()

※UML図の矢印の頭を取る

P.83 図5-4

誤 DatebasedriverInterface
正 DatebaseDriverInterface

P.84

誤 “Open Close Principle(OCP)”
正 “Open Closed Principle(OCP)”

P.93

誤 remains件
正 done件

P.93 リスト5-12

誤
remains
正
done

P.93 リスト5-13

誤
remains
正
done

P.94 リスト5-14

誤
remains
正
done

P.94 リスト5-14

誤
super
正
parent

P.97

誤 “Intereface Seperation Principle()”
正 “Intereface Segregation Principle()”

P.98 リスト5-17

誤
Intereace
正
Interface

P.98 リスト5-17

誤
DatabaseDiriverInterace
正
DatabaseDriverInterface

P.98 リスト5-17

誤
DataOutputInteface
正
DataInputInterface

P.98 リスト5-17

誤
DataInputInteface
正
DataInputInterface

P.98 リスト5-18

誤
vendorDatabaseDiriver
正
DatabaseDriverInterface

P.98 リスト5-18

誤
DatabaseDiriverInterface
正
DatabaseDriverInterface

P.99 リスト5-19

誤
DatabaseDiriverInterface
正
DatabaseDriverInterface

P.99 リスト5-19

誤
DatabaseInputInterace
正
DatabaseInputInterface

P.99 リスト5-19

誤
DatabaseDiriverInterace
正
DatabaseDriverInterface

P.99 リスト5-19

誤
DatabaseOutputInterace
正
DatabaseOutputInterface

P.119

誤 単位のテスト
正 単体のテスト

P.125

誤 TeatCaseクラス
正 TestCaseクラス

P.134

誤 willretuen()
正 willreturn()

P.142

誤 テストと実装はこうなります
正 テストとコードを書く手順は割愛しますが、この進め方でいくと実装はこうなります

P.155 リスト6-38

誤
PassTroghRuleTest
正
PassThroghRuleTest

P.155 リスト6-39

誤
PassTroghRule
正
PassThroghRule

P.160

誤 実装コード見るまで
正 実装コードを見るまで

P.171

誤 役立つ
正 役に立つ

P.172

誤 ピンと来きませんね。
正 ピンと来ませんね。

P.176

誤 保証しいる
正 保証している

P.106

誤 なせならそれは
正 なぜならそれは

P.199

誤 リスト8-3 getIterationの省略
正 リスト8-3 getIterator()の省略

P.200

誤 $itrerator
正 $iterator

P.202 リスト8-7

誤
RequestHandlerInterafce
正
RequestHandlerInterface

P.203

誤 RequestHandlerInterafce
正 RequestHandlerInterface<

P.203 リスト8-9

誤
$userAccessCheker
正
$userAccessChecker

P.204 リスト8-9

誤
userAccessCheker
正
$userAccessChecker

P.204 リスト8-9

誤
$resourceCheker
正
$resourceChecker

P.207

誤 PrizeItemInterafceとしましょう
正 PrizeItemInterfaceとしましょう

P.207 リスト8-10

誤
PrizeItemInterafce
正
PrizeItemInterface

P.207 リスト8-11

誤
PrizeItemInterafce
正
PrizeItemInterface

P.208 リスト8-11

誤
PrizeItemInterafce
正
PrizeItemInterface

P.209 リスト8-12

誤
PrizeItemInterafce
正
PrizeItemInterface

P.210 リスト8-13

誤
PrizeItemInterafce
正
PrizeItemInterface

P.212

誤 PrizeItemInterafce
正 PrizeItemInterface

P.220

誤 createAnimal()メソッド
正 createPet()メソッド

P.231 リスト8-32

誤
finishTheWrok()
正
finishTheWork()

P.232 リスト8-32

誤
finishTheWrok()
正
finishTheWork()

P.232 リスト8-33

誤
finishTheWrok()
正
finishTheWork()

P.233 リスト8-33

誤
InterafceA
正
InterfaceA

P.233 リスト8-33

誤
finishTheWrok()
正
finishTheWork()

P.234 リスト8-34

誤
InterafceA
正
InterfaceA

P.234 リスト8-34

誤
InterafceB
正
InterfaceB

P.234 リスト8-34

誤
finishTheWrok()
正
finishTheWork()

P.235 リスト8-36

誤
finishTheWrok()
正
finishTheWork()

P.237 リスト8-37

誤
MailerInterafce
正
MailerInterface

P.237

誤 MailerInterafce
正 MailerInterface

P.237 リスト8-38

誤
MailerInterafce
正
MailerInterface

P.241 リスト8-41

誤
$bottoRight
正
$bottomRight

P.242

誤 よくありあす
正 よくあります

P.247 図8-18

誤 node1
正 leaf1

P.247 図8-18

誤 node2
正 leaf2

P.247 図8-18

誤 node3
正 leaf3

P.249 リスト8-46

誤
RunableInterafce
正
RunableInterface

P.262 リスト8-55

誤
CommandInterafce
正
CommandInterface

P.263 リスト8-55

誤
CommandInterafce
正
CommandInterface

P.273

誤 方法考える
正 方法を考える

P.297

誤 意味でしなかい
正 意味でしかない

P.307

誤 Clear Craftmanship
正 Clean Craftsmanship

(以下2023年1月5日更新)

P.xxiv

誤 パッケージ原則を支えるためのに
正 パッケージ原則を支えるために

「の」が不要です。

P.9

誤 依存の実動作に違いが起きていることもあるれば
正 依存の実動作に違いが起きていることもあれば

「る」が不要です。

P.49 ▼リスト3-7 多態性を活用したロギングのオンオフ コメント文

誤
Do nothiong
正
Do nothing

「o」が不要です。

P.138

誤 ▼リスト6-13 src/core/NumberConverter.php
正 ▼リスト6-13 src/Core/NumberConverter.php
誤 ▼リスト6-14 tests/core/NumberConverterTest.php
正 ▼リスト6-14 tests/Core/NumberConverterTest.php

P.147

誤 ▼リスト6-27 src/core/ReplaceRuleInterface.php(初案)
正 ▼リスト6-27 src/Core/ReplaceRuleInterface.php(初案)

P.161

誤 ▼リスト6-44 src/core/ReplaceRuleInterface.php(第2案)
正 ▼リスト6-44 src/Core/ReplaceRuleInterface.php(第2案)

P.190

誤 ▼リスト7-19 config/services/yaml(最適化版)
正 ▼リスト7-19 config/services.yaml(最適化版)

P.234 ▼リスト8-36 Mediatorのコードのミスページ

誤
public function notifyActivity()
正
public function notifyActivityDone()

P.253 ▼リスト8-50 Strategy パターンによる実現方法

誤
interface CalcurationStrategyInterface
{
	public function validate(array $vars): bool;
	public function calcurate(array $vars): float;
}
class Expression implements ExpressionInterface
{
	protected ?array $vars = null;
	protected ?CalcurationStrategyInterface $calcurationStrategy = null;
	public function setCalcurationStrategy(
		CalcurationStrategyInterface $strategy
	): void {
		$this->calcurationStrategy = $strategy;
	}

	public function setVariables(array $vars): void {
		if ($this->calcurationStrategy->validate($vars)) {
			throw new InvalidArgumentException();
		}
		$this->vars = $vars;
}
	public function evaluate(): float
	{
		if ($this->vars === null || $this->calcalcurationStrategy === null) {
			throw new LogicException();
		}
		return $this->calcurationStrategy->calcurate($this->vars);
	}
}
class PlusCalcurationStrategy implements CalcurationStrategyInterface
{
	public function validate(array $vars): bool
	{
		return count($vars) === 2;
	}

	public function calcurate(array $vars): float
	{
		return $vars[0] + $vars[1];
	}
}
//他にminusCulculationStrategyもある
$expression = new Expression();
$expression->setCalcurationStrategy(new PlusCalcurationStrategy());
// ExpressionInterfaceとして使う
$expression->setVariables([1.1, 2.2]);
echo $expression->evaluate(); // 3.3
正
interface CalculationStrategyInterface
{
	public function validate(array $vars): bool;
	public function calculate(array $vars): float;
}
class Expression implements ExpressionInterface
{
	protected ?array $vars = null;
	protected ?CalculationStrategyInterface $CalculationStrategy = null;
	public function setCalculationStrategy(
		CalculationStrategyInterface $strategy
	): void {
		$this->CalculationStrategy = $strategy;
	}

	public function setVariables(array $vars): void {
		if ($this->CalculationStrategy->validate($vars)) {
			throw new InvalidArgumentException();
		}
		$this->vars = $vars;
}
	public function evaluate(): float
	{
		if ($this->vars === null || $this->calCalculationStrategy === null) {
			throw new LogicException();
		}
		return $this->CalculationStrategy->calculate($this->vars);
	}
}
class PlusCalculationStrategy implements CalculationStrategyInterface
{
	public function validate(array $vars): bool
	{
		return count($vars) === 2;
	}

	public function calculate(array $vars): float
	{
		return $vars[0] + $vars[1];
	}
}
//他にminusCulculationStrategyもある
$expression = new Expression();
$expression->setCalculationStrategy(new PlusCalculationStrategy());
// ExpressionInterfaceとして使う
$expression->setVariables([1.1, 2.2]);
echo $expression->evaluate(); // 3.3

P.254 ▼図8-20 Strategyパターンによる式 図の中にある文字の修正

誤 CalcurationStrategyInterface
正 CalculationStrategyInterface
誤 PlusCalcurationStrategy
正 PlusCalculationStrategy
誤 MinusCalcurationStrategy
正 MinusCalculationStrategy

P.255 9行目

誤 calcurate()
正 calculate()

P.284

誤 モデル駆動設計(MDD:Make Driven Design)
正 モデル駆動設計(MDD:Model Driven Design)

商品一覧