【SASブランド連載】第3回 シンプルなソフト設計とは何か

  2023年06月01日
   ■Tags: | | | | | |

スマートエイジングサポート(以下SASと呼ぶ)は、製品やカスタム品設計の受託を行っています。
お客様が満足できる「納期 と 品質」をお届けできるようにするため、5年前から「SASブランド」を立ち上げ、社員全員で力を合せて日々の業務を行っています。

その活動をご紹介する「SASブランド」シリーズの、今回は第3回になります。
第1回から第2回に続き「SASブランドとは何か」という中で、制御ソフト設計においての中心的な考え方となる「シンプルなソフト設計の手法」についてご紹介します。

連載記事はこちら → 第1回 第2回(第3回)第4回  第5回  第6回 第7回

【シンプルな制御ソフトとは】

制御ソフトに求められる品質において、SASが最も重要と考えるものは「分かりやすさ」になります。
それを別の言葉で言うと「見える化されている」に言い換えられると思います。
それは、要求仕様の機能面だけでなく、性能面(処理速度や精度)も把握できている度合が高いものが良い品質であると考えています。

【シンプルなソフト設計の手法 とは】

それを実現するための「基本思想」としては、
㋐ 構造が重要

  • 構造設計 = タイミング設計である
  • データ構造を中心に考える
  • 処理(挙動)が分かりやすい = 挙動の見える化

㋑ 処理は軽く

  • 分散処理(オブジェクト化にこだわり過ぎない)

㋒ 機能単位で設計する

  • 機能単位で関数をまとめる
  • 関数型プログラミングも併用する
  • 出来る限り部品化/流用できるようにする

㋓ 制御対象の特性を十分に理解する

といったことが挙げられます。もう少し、具体的な設計手法について紹介をする前にソフトウェア技法について参考文献から抜粋してご紹介しておきます。

① 構造化プログラミング

構造化定理:プログラムは、「順次・選択・繰り返し」の3つの基本構造を組み合わせた、1つの入り口と1つの出口を持つ形式で記述できる。
(中略)
 これは、システム全体では複雑な処理に見えても、細かく分割していけば単純な処理の積み重ねにできる、というものです。

https://thinkit.co.jp/article/904/1
より引用

② 関数型プログラミング

関数型プログラミングは、関数の組み合わせでコーディングするプログラミング方法です。問題の性質を数学的な表現で記述できるため、研究目的での利用に適しています。
(中略)
関数型プログラミングは簡潔な関数の組み合わせでプログラミングします。 個々の関数は独立しており、実行中の処理の影響を受けません。 そのため、コード全体がシンプルで人が見て分かりやすく、保守性や再利用性に優れています。
(中略)
関数型プログラミングで記述されたコードは、同じ入力に対し常に同じ結果を返します。 命令型プログラミングでは変数の値が動いていくことなどによって結果が変わりますが、関数型では実行中に変数の値の変更が起きません。 そのため、入力と出力の関係をシンプルにとらえることができ、テストが簡単です。

https://it-trend.jp/development_tools/article/32-0053
より引用

③ オブジェクト指向プログラミング

システム全体の機能を、オブジェクト間の相互作用で表現する、すなわち「オブジェクトに分割していく」という考え方が、オブジェクト指向と言えます。ここで言うオブジェクトとは、データと処理を持つモジュールという風に考えてください。
 このオブジェクト指向は、ますます大規模化、複雑化するソフトウエアの開発効率を上げるには部品化によるモジュールの再利用化が不可欠であり、それは構造化技法だけでは実現できない、という背景があり普及していきました。

https://thinkit.co.jp/article/904/1
より引用

【SAS独自のソフトウェア手法】

上記①~③のソフトウェア技法の「いい所どり」をして、「分かりやすいプログラム」をつくるための「基本思想」が生まれました。もう少し、具体的な設計手法については、

  • システムの初期化(変数の初期化・周辺デバイスの初期化)をはじめに行う
  • 変数は出来る限り機能単位の構造体とする
  • 処理のコメントは必ず書く。値は意味(計算式)を書く
  • 不要なコメントは必ず削除して分かりやすくする
  • 定数はDEFINE定義を基本とする
  • オブジェクト名は意味が分かる名称とする
  • メインループに機能単位の処理をまとめる
  • 各機能を処理サイクル時間別にまとめタイミングを明確にする
  • タイマ割込みはできる限りタイミング生成用タイマの処理にして軽くする
  • メインループ時間は 1ms以内 を目標にする
  • メインと割込み間のタイミングは 1ビットフラグで同期を取り変数の受渡しを確実にする
  • 各機能の処理時間やタイミングを見える化するために外部に出力して検証できる準備する
  • ドキュメントは必要最低限に抑えコメントを含めてプログラム内の正確性を上げる

といったことが挙げられます。また、他の人が見てもコードが追えることを目指して、コーディング規約にはプログラミングの基本的な指針のみを明記しています。

次回は、回路設計においての「シンプルな回路設計の手法」についてご紹介したいと思います。