書籍概要

ちょうぜつソフトウェア設計入門
――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)

商品一覧