マーリンアームズ サポート   翻訳   コンサル   講座   アプリ   コラム
JavaScript講座     辞書サイト

プロフェッショナルPython ソフトウェアデザインの原則と実践

Dane Hillard著   武舎広幸訳

現在校正作業中ですので、変更の可能性があります。
あらかじめご了承ください。

章目次

はじめに
謝辞
本書について
対象読者
本書の構成
コードについて
著者紹介

第I部 ソフトウェアデザインとPython
 第1章 ソフトウェア開発とPython

第II部 ソフトウェアデザインの基礎
 第2章 関心の分離
 第3章 抽象化とカプセル化
 第4章 パフォーマンスを考慮したデザイン
 第5章 ソフトウェアのテスト

第III部 大規模システムへの応用
 第6章 「関心の分離」の実践
 第7章 拡張性と柔軟性
 第8章 継承
 第9章 クラスや関数の軽量化
 第10章 疎結合の実現

第IV部 これからどう学ぶか
 第11章 さらなる学びの題材
 第12章 さらに先へ

付録A Pythonのインストール

目次(詳細)

はじめに
謝辞
本書について
対象読者
本書の構成
コードについて
著者紹介

第I部 ソフトウェアデザインとPython
第1章 ソフトウェア開発とPython
コラム Pythonのバージョン
1.1 Pythonによる開発の優位性
1.1.1 「時代は変る」
1.1.2 なぜPythonは好ましい言語か
1.2 Pythonは教えやすい言語である
1.3 デザインはプロセス
1.3.1 ユーザーエクスペリエンス(UX)
コラム 「摩擦」のない使用感
1.3.2 経験を活かす
1.4 デザインがよりよいソフトウェアを作る
1.4.1 ソフトウェアデザインにおける考慮事項
1.4.2 有機的なソフトウェア
1.5 いつデザインに投資するべきか
1.6 デザインは共同作業である
1.6.1 心構えとPEPLの利用
1.7 この本の使い方
1.8 まとめ

第II部 ソフトウェアデザインの基礎
第2章 関心の分離
2.1 ネームスペース
2.1.1 ネームスペースとimport文
2.1.2 importの種類
2.1.3 ネームスペースによる衝突の防止
2.2 Pythonにおける分離の階層
2.2.1 関数
2.2.2 実践課題
2.2.3 クラス
2.2.4 モジュール
2.2.5 パッケージ
2.3 まとめ

第3章 抽象化とカプセル化
3.1 抽象化
3.1.1 ブラックボックス化
3.1.2 抽象化のレイヤー
3.1.3 抽象化は単純化
3.1.4 分割が抽象化を可能にする
3.2 カプセル化
3.2.1 Pythonにおけるカプセル化の機構
3.2.2 Pythonにおけるプライバシー
3.3 抽象化の実例
3.3.1 リファクタリング
3.4 プログラミングスタイルと抽象化
3.4.1 手続き型プログラミング
3.4.2 関数型プログラミング
3.4.3 宣言型プログラミング
3.5 型と継承
3.6 抽象化の良し悪し
3.6.1 アダプタの作成
3.6.2 さらに賢く
3.7 まとめ

第4章 パフォーマンスを考慮したデザイン
4.1 時間と空間
4.1.1 計算量の複雑さ
4.1.2 時間計算量
4.1.2.1 線形オーダー
4.1.2.2 O(n2)の処理
4.1.2.3 定数オーダー
4.1.3 空間計算量
4.1.3.1 メモリ
4.1.3.2 ディスク容量
4.2 パフォーマンスとデータ型
4.2.1 定数オーダーのためのデータ型
4.2.2 線形時間のデータ型
4.2.3 データ型ごとの空間計算量
4.3 動作するものを作り、質を高め、高速化せよ
4.3.1 動作するものを作る
4.3.2 質を高める
4.3.3 高速化
4.4 ツール
4.4.1 timeit
4.4.2 CPUプロファイリング
4.5 実践課題
4.6 まとめ

第5章 ソフトウェアのテスト
5.1 ソフトウェアテストとは
5.1.1 テストの目的
5.1.2 機能テストの手順
5.2 テストの種類
5.2.1 手動テスト
5.2.2 自動テスト
5.2.3 検収テスト
5.2.4 単体テスト
5.2.5 統合テスト
5.2.6 テストピラミッド
5.2.7 リグレッションテスト
5.3 アサーション
5.4 unittestを用いたテスト
5.4.1 unittestを用いたテストの構成
5.4.2 unittestを使ったテストの実行
5.4.3 unittestを使ったテストの記述
5.4.4 unittestを使った統合テストの記述
5.4.5 テストダブル(テスト代替)
5.4.6 実践課題
5.4.7 よいテスト
5.5 pytestを使ったテスト
5.5.1 pytest実行時の構成
5.5.2 unittestのテストのpytestへの変換
5.6 機能テストを超えて
5.6.1 パフォーマンステスト
5.6.2 ロードテスト
5.7 テスト駆動開発
5.7.1 心構えの大切さ
5.7.2 TDDの「哲学」
5.8 まとめ

第III部 大規模システムへの応用
第6章 「関心の分離」の実践
6.1 コマンドベースのブックマークアプリケーション
6.2 概要
6.2.1 分離の効用(再確認)
6.3 コードの構造
6.3.1 パーシスタンス層
6.3.1.1 データベースへの接続とクローズ
6.3.1.2 ステートメントの実行
6.3.1.3 テーブルの生成
6.3.1.4 レコードの追加
6.3.1.5 アクションのスコープを限定するための節
6.3.1.6 レコードの削除
6.3.1.7 レコードの選択とソート
6.3.2 ビジネスロジック層
6.3.2.1 ブックマークテーブルの生成
6.3.2.2 ブックマークの追加
6.3.2.3 ブックマークのリスト
6.3.2.4 ブックマークの削除
6.3.2.5 Barkの終了
6.3.3 プレゼンテーション層
6.3.3.1 データベースの初期化
6.3.3.2 メニューの表示
6.3.3.3 ユーザーからの入力
6.3.3.4 画面のクリア
6.3.3.5 アプリケーションループ
6.4 まとめ

第7章 拡張性と柔軟性
7.1 拡張性の高いコードとは
7.1.1 新機能の追加
7.1.2 既存の機能の変更
7.1.3 疎結合
7.2 柔軟性を確保するためのソリューション
7.2.1 制御の反転
7.2.2 インターフェイスの重視
7.2.3 堅牢性原則
7.3 Barkの拡張
7.4 まとめ

第8章 継承
8.1 プログラミングにおいて継承の占める位置の変遷
8.1.1 「銀の弾」
8.1.2 階層構造の問題点
8.2 プログラミングにおける継承の意味
8.2.1 継承は本当は何のためのものか
8.2.2 置換可能性
8.2.3 継承が使える理想的なケース
8.2.3.1 浅く狭い階層構造
8.2.3.2 オブジェクトグラフの末端のサブクラス
8.2.3.3 サブクラスとスーパークラスのビヘイビアの関係
8.2.3.4 課題
8.3 Pythonにおける継承
8.3.1 型の検査
8.3.2 スーパークラスへのアクセス
8.3.3 多重継承とメソッド解決順序
8.3.4 抽象基底クラス
8.4 Barkにおける継承の利用
8.4.1 抽象基底クラスの利用
8.5 まとめ

第9章 クラスや関数の軽量化
9.1 関数・クラス・モジュールの適切な大きさは?
9.1.1 物理的サイズ
9.1.2 提供する機能の数
9.1.3 コードの複雑さ
9.1.4 コードの複雑さの計測
9.2 複雑度の低減
9.2.1 コンフィギュレーションの抽出
9.2.2 関数の抽出
9.3 クラスの分割
9.3.1 初期化
9.3.2 クラスの抽出とフォワーディング
9.4 まとめ

第10章 疎結合の実現
10.1 結合度
10.1.1 結合の状態
10.1.2 密結合
10.1.3 疎結合
10.2 結合度の認識
10.2.1 機能羨望
10.2.2 散弾銃手術
10.2.3 抽象化の漏れ
10.3 Barkの結合状態
10.4 密結合への対処法
10.4.1 ユーザーメッセージング
10.4.2 ブックマークの永続性
10.4.3 実践課題
10.5 まとめ

第IV部 これからどう学ぶか
第11章 さらなる学びの題材
11.1 デザインパターン
11.1.1 Pythonのおけるデザインパターンの適用
11.1.2 デザインパターン関連の用語
11.2 分散システム
11.2.1 分散システムにおける障害の原因
11.2.2 アプリケーションの状態の確認
11.2.3 分散システム関連の用語
11.3 Pythonをより深く知る
11.3.1 Pythonのコードスタイル
11.3.2 プログラミング言語の機能とパターン
11.3.3 Python関連の用語
11.4 まとめ

第12章 さらに先へ
12.1 これからを考える
12.1.1 計画立案
12.1.2 計画の実行
12.1.3 進歩の確認
12.1.4 ここまでの道を振り返る
12.1.5 終わりに
12.2 まとめ


付録A Pythonのインストール
A.1 Pythonのバージョン
A.2 システムPython
A.3 他のバージョンのインストール
A.3.1 公式Pythonのダウンロード
A.3.2 Anacondaを使ったダウンロード
A.4 インストールの確認