1
0

More than 1 year has passed since last update.

静的コナーセンスについて 「意味のコナーセンス」から「名前のコナーセンス」に弱めるコード実例

Last updated at Posted at 2022-07-24

本記事の目的

現在、「ソフトウェアアーキテクチャの基礎 エンジニアリングに基づく体系的アプローチ」を読んでいます。
*読んでいる途中で記事を書いているので、間違った解釈が含まれているかもしれません。

この本で「コナーセンス」という言葉が出てきます。
コナーセンスには、「静的コナーセンス」と「動的コナーセンス」という二種類に分けられますが、今回は、静的コナーセンスの中にある「意味のコナーセンス」と「名前のコナーセンス」について、コードベースでお話したいと思います。

新卒1年目の記事のため、説明が下手だったりすると思いますが、お手柔らかにお願いします。

静的コナーセンスとは

この本では、Page-Jonesという方が定義したと書かれていました。

静的コード解析によって発見可能な静的コナーセンスと、実行時の振る舞いに関する動的コナーセンスという、2種類のコナーセンスを定義した。

つまり、静的コナーセンスは、コード解析やコード部分でのコナーセンスである。

「意味のコナーセンス」...マジックナンバーとか。意味のある値
「名前のコナーセンス」...定数名、クラス名、メソッド名とか。命名。

静的コナーセンスについて少し調べてみた

コナーセンス?なにそれおいしいの状態だったので、少し調べて、コナーセンスについて素人なりに知ろうとしました。

参考にしたのは、下記の記事
https://qiita.com/fujiharuka/items/68fadefa6dad4cf33b4d

すごくわかりやすく勉強になりました。この記事でコナーセンスの理解度が高まりました。

コードベースで説明し、まとめておきたいなと思い記事書いている

静的コナーセンスは、コードに関するものなので、コードで説明しまとめておきたいな...と思い、書きました。(自分が忘れないようにするためにも)

今回は、参考記事にも説明されている「意味のコナーセンス」から「名前のコナーセンス」に弱めることについてコードベースでどうやれば弱められるのかを説明したいと思います。

じゃあ、実際にコードで説明する。

マジックナンバーが含まれているソースコード

magicNumber.php
<?php
class magicNumber
{
  private function main(int price)
  {
    price = price * 1.10;
    return price;
  }
}

上記はあくまでマジックナンバーの簡単な例だが、priceという入力値から消費税をかけて返却している。
この消費税を加える際にこのメソッドを利用するのだろうけど、「1.10」という数値には、意味が含まれており、本来は定数クラスなどに定義する必要がある。

別の例だと

magicNumber2.php
<?php
class magicNumber2
{
  private function main()
  {
    ...
    if ($serviceType === 1)
    {
      return 'トランプ';
    }
    else if ($serviceType === 2)
    {
      return 'テレビゲーム';
    }
    else if ($serviceType === 3)
    {
      return 'チャンバラ';
    }
  }
}

serviceTypeという変数を元に遊びの名前を返している。(例がひどくて申し訳ない...)
このif文の判定に数字を用いているが、1とか2とか実はただの数字ではなく、1はトランプ。2はテレビゲームという意味が含まれています。

では、これをどうすればよいか。

定数クラスを定義し、各種クラスのメソッドから意味ある定数であることを明確化します。

gameServiceType.php
<?php
final class gameServiceType
{
  const SERVICE_TYPE_TRUMP = 1;
  const SERVICE_TYPE_TVGAME = 2;
  const SERVICE_TYPE_CHANBARA = 3;
}
magicNumber2.php
<?php
class magicNumber2
{
  private function main()
  {
    ...
    if ($serviceType === gameServiceType::SERVICE_TYPE_TRUMP)
    {
      return 'トランプ';
    }
    else if ($serviceType === gameServiceType::SERVICE_TYPE_TVGAME)
    {
      return 'テレビゲーム';
    }
    else if ($serviceType === gameServiceType::SERVICE_TYPE_CHANBARA)
    {
      return 'チャンバラ';
    }
  }
}

といった具合に変えれます。
(そもそも1とか2とか数字使うなよ!というのはごもっともですが、例が思いつかなかったのと、長いサービスほどこれってあり得るのでは?と思います。やってはいけないと知りながら...)

言いたいことは結局何かというと...

「意味のコナーセンス」は、ここでいうとif文のとかであったり、消費税の1.10になります。
「名前のコナーセンス」は、ここでいうと定数名。

「意味のコナーセンス」
から
「名前のコナーセンス」という変更容易なものへと変化しています。

コナーセンスという言葉言っているだけで、中身はリファクタリングや可読性をあげることになります。
(今回のコナーセンスの変化については。)

長くなりましたが、

説明は以上になります。
あまり詳細に丁寧に書いていませんが、今回はざっと書きました。

また、何かあればメモ程度に書いていきます。

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0