関連サイト
本書の関連ページが用意されています。
内容紹介
クリーンで柔軟性の高いプログラムを開発できる。プロの品質を実現するデザイン手法を多面的に解説。
<抽象化、カプセル化、パフォーマンス、テスト、拡張性と柔軟性、クラスの継承、疎結合、リファクタリング、デザインパターン .etc>
プログラマーが考慮すべきソフトウェアデザインのアプローチとして、さまざまな手法がこれまで登場し発展してきました。
たとえば、1960年代の構造化プログラミング以降で発展した「関心の分離」や「抽象化」、オブジェクト指向の中心概念の1つ「カプセル化」などが挙げられます。これらは、いずれもソフトウェアの開発/運用をより容易にし、拡張性・保守性を高めるものです。
本書では、それらのアプローチをどのように理解し、Pythonでどのように実践していけばよいのかを解説します。
本書の内容を習得することで、初中級者はコーディングスキルを大きく向上させ、プロフェッショナルなプログラミングへの道を見通せるようになります。ベテランの開発者が最近のトレンドを押さえて昔の知識を更新するのにもよいでしょう。
書誌情報
- 著者: Dane Hillard(著), 武舎広幸(訳)
- 発行日: 2021-11-16 (紙書籍版発行日: 2021-11-16)
- 最終更新日: 2021-11-16
- バージョン: 1.0.0
- ページ数: 320ページ(PDF版換算)
- 対応フォーマット: PDF, EPUB
- 出版社: インプレス
対象読者
現場で活用すべくPythonを学ぼうとしている方・利用しようとしている方。
著者について
Dane Hillard
学術・研究・教育用コンテンツを提供する米国NGOであるITHAKAのWebアプリケーション開発リーダー。同社においてこれまでデータ推論エンジン、生命情報科学アプリケーションなどの開発を行ってきた。プロのソフトウェア開発者としてキャリアの大半をPythonによるWebアプリケーション構築に費やしている。また、PythonやDjangoのカンファレンスで講演を継続的に行っている。多くのデータサイエンティスト、プロのプログラマー、Pythonを使っている独学プログラマーに対して、プロのソフトウェア開発技術を紹介することに情熱を注いでいる。
武舎広幸
マーリンアームズ株式会社代表取締役。機械翻訳など言語処理ソフトウェアの開発と人間翻訳に従事。国際基督教大学の語学科に入学するも、理学科(数学専攻)に転科。山梨大学大学院修士課程に進学し、ソフトウェア工学を専攻。修了後、東京工業大学大学院博士課程に入学。米国オハイオ州立大学大学院、カーネギーメロン大学機械翻訳センター(客員研究員)に留学後、満期退学し、マーリンアームズ株式会社を設立。
目次
この本のマインドマップ
はじめに
- 本書について
- 謝辞
- 著者・翻訳者紹介
第1部 ソフトウェアデザインとPython
第1章 ソフトウェア開発と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 心構えとREPLの利用
- 1.7 この本の使い方
- 1.8 まとめ
第2部 ソフトウェアデザインの基礎
第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 まとめ
第3部 大規模システムへの応用
第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 まとめ
第4部 これからどう学ぶか
第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 インストールの確認