2020-11-02

『オブジェクト指向入門 第2版』の1章を読んだ

バートランド・メイヤーのオブジェクト指向入門 第2版の1章を読んだのでメモ.

分厚いから1章ずつゆっくり読もうと思ったら36章まであるのね……


ユーザーが認識できる性質を外的品質要因,それ以外の性質(コードの読みやすさなど)を内的品質要因という.

最終的に問題になるのは外的品質要因だが,それを実現するためには内的品質要因を実現しなければならない.内的品質要因の実現はそれ自身が目的ではない.

品質を考える際には,1つの要因ではなく,いくつかの要因のバランスを基準に判断すると良い.

外的品質要因について

正確さ

使用によって定義されている通りに仕事をする能力.型付や表明はソフトウェアの構築を支援する.デバッグとテストは正確さを確認する手段である.

頑丈さ

異常な条件に適切に対応する能力.ここでいう「異常」はソフトウェアの設計で考慮されないことを指す.仕様に明示的に記述されないケースによってシステムが壊れないようにするのが頑丈さの役割である.

拡張性

仕様の変更に対する適応のしやすさ.要求の変更,実装方法の変更などに対処することが拡張性の役割である.拡張性を向上させる原則は以下の2つである.

  • 設計の単純さ
  • 非集中化:モジュールの依存関係が単純であれば,変更の影響がシステム全体に広がらない.

再利用性

多様なアプリケーションの構築に使うことのできる能力.複数のソフトウェアシステムに共通するパターンを把握することで,再利用可能なソフトウェア要素を異なる開発に応用できる.

互換性

ソフトウェアの要素の,他のソフトウェアの要素との組み合わせやすさ.設計が同質であったり,プログラム間のコミュニケーションの標準的規約が一致しているソフトウェア要素は互換性が高い.

効率性

ハードウェア資源をできる限り必要としない能力.

効率性は重要だが,正しくなければ意味がなく,極端な効率化は拡張性や再利用性の低下を招く.効率性を考えるときは,他の目標とのバランスを取る必要がある.

可搬性

ソフトウェア製品の移植のしやすさ.

使いやすさ

ソフトウェア製品の使いやすさ.上級レベルのユーザーの邪魔をせず,かつ入門レベルのユーザーに対して詳細な指示と説明を与えられるようにする必要がある.

ソフトウェアは,必ずしも開発者が意図したユーザーのみが使うとは限らない.そのため,開発者が想定するユーザーを基準に使いやすさを考えると,より広い範囲のユーザーには受け入れられにくいソフトウェアになってしまう.使いやすいインタフェースの設計では,ユーザーについての前提条件をできるだけ作らないようにする必要がある.

機能性

そのシステムが提供する機能の範囲.

機能の追加には,以下のような悪い影響をもたらすことがある.

  • システムが複雑になり,使いやすさが損なわれる.

    この問題の対処法は,すべての要素がある共通の性質を持つ1つのかたまりにすることである.すべての機能に一貫性を持たせ,システムの基本的な概念から逸脱しないようにする.

  • 他の品質特性がなおざりになる.

    他の特性が実現できていない場合は,新しい機能の追加を拒否する.

適時性

ユーザーが必要としたとき,あるいは必要とする前にソフトウェアシステムをリリースできること.

トレードオフ

品質特性には,お互いに対立する条件を持つものがある.場合によっては,ある特性の実現を諦めなければならないことも起こる.ただし,正確さのみは例外で,正確さは他のどの特性よりも優先しなければならない.

オブジェクト指向手法が改善する特性

  • 正確さ,頑丈さ(両方あわせて,信頼性)

    安全性に関連する要因

  • 拡張性,再利用性(両方あわせて,モジュラー性)

    分散方のソフトウェアアーキテクチャを必要とする要因

    非集中化されたアーキテクチャの生成によって実現する

  • 互換性:インタフェースの標準化により実現

  • 可搬性:抽象化や情報隠蔽により,仕様に関する属性と実装に関する属性を区別しやすくすることで実現

  • 使いやすさ

  • 効率性:品質の高いコンポーネントを利用することで実現

  • 適時性,経済性,機能性