インプレス[コンピュータ・IT]ムック プロフェッショナルPython ソフトウェアデザインの原則と実践
インプレス / 2021年11月16日 / 全319ページ
<クリーンで柔軟性の高いプログラムを開発できる! プロの品質を実現するデザイン手法を多面的に解説> プログラマーが考慮すべきソフトウェアデザインの手法として、1960年代以降の「関心の分離」「抽象化」、オブジェクト指向の「カプセル化」などが登場し発展してきました。いずれも開発/運用をより容易にし、拡張性・保守性を高めるものです。それらをどのように理解し実践していけばよいのかを解説します。初中級者はコーディングスキルを向上させ、ベテランの開発者は昔の知識を更新できる内容となっているはずです。
目次
- 例題コード・正誤表・商標などについて
- この本のマインドマップ
- はじめに
- 本書について
- 謝辞
- 著者・翻訳者紹介
- 第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章 関心の分離
- 例題コード・正誤表・商標などについて
- この本のマインドマップ
- はじめに
- 本書について
- 謝辞
- 著者・翻訳者紹介
- 第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 インストールの確認
- 索引
- STAFF LIST
- 奥付
※このデジタル雑誌には目次に記載されているコンテンツが含まれています。それ以外のコンテンツは、本誌のコンテンツであっても含まれていません のでご注意ください。
※電子版では、紙の雑誌と内容が一部異なる場合や、掲載されないページがある場合があります。