書籍概要

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

著者
発売日
更新日

概要

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

こんな方におすすめ

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

サンプル

samplesamplesamplesamplesample

目次

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

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

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

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

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

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

第7章 ›› 依存性注入

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

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

サポート

正誤表

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

(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)

商品一覧