保守性の低いシステムとは【リファクタリング解説2】

この記事の説明

機能の追加、変更、削除だけでなく、バッチファイルやフレームワークなどのアップグレードの適応も容易である性質を意味する。では保守性の低いシステムとはどのようなシステムだろうか

そもそも保守性とは

そもそも保守性とは

機能の追加、変更、削除だけでなく、バッチファイルやフレームワークなどのアップグレードの適応も容易である性質

を意味する。

では保守性の低いシステムとはどのようなシステムだろうか

保守性の低いシステム一覧(私見あり)

保守性の低いアーキテクチャは例えば以下のようなもの

詳細は後ほど

詳細

このシステムは技術による分割がメインであり、一つの事業の変更がシステムの全てに反映される。

議論の余地ありで再利用性が高いが、個人的には保守性は高くない。

議論の余地ありだが、応答速度に特化したイメージ。

保守性の高いシステム一覧

詳細

モノシリックの中では保守性が最も高い。プラグインとして機能が独立しているため、改修後の変更範囲が狭く、予測しやすい。

後述

処理ユニットごとにドメインが決まっている場合、一つの事業的な変更が処理ユニット内部に収まる。

後述

保守レベル0:大規模なモノシリックなシステムは保守性が低い

一般に、大規模なモノシリックなシステムは保守性が低いと言われる。

これは以下の理由が挙げられる。

  1. 機能をレイヤーで技術的に分割していること

  2. コンポーネント同士の結合度(依存度)が高いこと

  3. ドメインの観点から見た時の凝縮度が低いこと

が挙げられる。

from https://techblog.short-tips.info/inhouse_se/2001layerd_arch.md

例えばこのようなレイヤードなシステム(モノシリックなシステムの一種で画面、ロジック、データベースの3つの層で分ける技術的な分割のなシステム)に「有効期限データを追加する」という変更を行うとする。

  1. 新しい有効期限を画面に出力するために、フロントエンド一人が必要

  2. 有効期限に関するビジネスルールを制御するコードをロジック層に追加するバックエンド一人が必要

  3. データベーステーブルを変更するデータベースメンバー一人が必要

このうえ、有効期限データを追加以外にもどこに変更が及ぶのかが明確でないため、変更した際の影響範囲の予測が難しく、リリース時のエラーが発生しうる

このように、特定のドメインがシステム全てに広がっている場合はそのメンテナンスは難しくなる

保守レベル50:サービスベースなシステムは保守性が比較的高い

次の例は、保守性の比較的高いサービスベースなシステムの例である

一般的に、中央でデータベースを構えているという点が、このアーキテクチャの重要な側面である。 これより、元来使われてきたモノシリックなサービスでのSQLクエリの結合を活用できる。

サービスベースアーキテクチャは、マイクロサービスアーキテクチャの要素もある、分散型のアーキテクチャだ。

from https://techblog.short-tips.info/inhouse_se/2004service_base_arch.md

先ほどの要件の変更範囲は、特定のドメインサービス内に収まっている。 ドメインを変更した際に、別のドメインに影響がないことがうかがえる。

保守レベル100:マイクロサービスなシステムは保守性が高い

次の例は、サービスベースなシステムをさらに進化させたマイクロサービスシステムの例である。

マイクロサービスは分散システムを形成し、各サービスは独自のプロセスで実行されます。 「各サービスのプロセス」とは元々は物理コンピューターを意味していましたが、すぐに仮想マシンとコンテナーに進化しました。

要件の変更範囲は機能レベルとなり、変更は追加機能部分に責務を持つ特定のサービスのみとなる。

まとめ:モジュール化が進めばメンテナンス性、保守性が向上する

システムのモジュール性の度合いが上がると、機能の追加や変更、削除が容易になり、メンテナンス性が向上する。

title:保守性の高いシステムと低いシステムの違い

description:機能の追加、変更、削除だけでなく、バッチファイルやフレームワークなどのアップグレードの適応も容易である性質を意味する。を意味する。では保守性の低いシステムとはどのようなシステムだろうか

img:https://github.com/kawadasatoshi/techblog/blob/main/0/inhouse_se/3045/five.png?raw=true

category_script:page_name.startswith("3")