dimeizaのブログ

興味のある技術(IoT/VR/Smart Speaker)とか、資格試験の話とか、日常で出会ったTechな話について書いています。

『モジュール結合度』が日本語で説明されている時の誤謬らしきもの

 初めてBlogを書くときには軽めのネタがいいんじゃないかなぁと思っていたのですが、ちょうどそんなネタが回ってきたので。

モジュール結合度(coupling)

 という言葉を聞いたことがおありの方はたくさんいらっしゃるかと思います。

 IPAの試験とかでよく問われる単語ですね。

 このモジュール結合度、こんな感じで順序付けされています(昇順)。

  1. データ結合
  2. スタンプ結合
  3. 制御結合
  4. 外部結合
  5. 共通結合
  6. 内部結合

 この中で、"外部結合"と"共通結合"の差について、とある場所でとある先生がとある言説をしていたのを聞きとがめまして。

『外部結合は外部データをお互いが共有するというような情報の共有方法』

『共通結合は構造型の外部データを共有する方法』

 え、これおかしくないですか? と思った私は、先生の講義そっちのけで調べ物に入りました。

外部結合と共通結合の違いは?

 なんとなくおかしいなと思ったのですが、この言説って結構あるんですよね。

モジュールの強度と結合度<システムの調達<Web教材<木暮

http://www.geocities.jp/nakamiya_town/ProModule.html

d.hatena.ne.jp

 で、WikiPediaによるとこうあるわけです。

結合度 - Wikipedia

共通結合(Common coupling)

グローバル結合とも呼ばれ、二つのモジュールが同じグローバルデータ(例えば、グローバル変数)を共有する。共通のリソースを変更すると、それを使用したすべてのモジュールを変更することを意味する。

外部結合(External coupling)

二つのモジュールは、外部から供給されたデータ·フォーマット、通信プロトコル、またはデバイスインターフェイスを共有している場合に起こる。 これは基本的に外部ツールやデバイスへの通信に関連している。

 どうせ海外発の概念だし、WikiPediaをうのみにするのもどうよ、と思ったので英語で検索。

 英語版のWikiPediaではこうでした。

Coupling (computer programming) - Wikipedia

Common coupling

Common coupling (also known as Global coupling) occurs when two modules share the same global data (e.g., a global variable).

Changing the shared resource implies changing all the modules using it.

External coupling

External coupling occurs when two modules share an externally imposed data format, communication protocol, or device interface. This is basically related to the communication to external tools and devices.

 日本語版は英語版の訳だったが…と思いつつ、言っていることはWikiPediaとそれ以外で相違しています。

 もう少し英語のネタを漁っていきます。

http://faculty.cs.uwlax.edu/~riley/CS741Sum10/lectures/8_CouplingCohesion.pdf

CPSC 333: Levels of Coupling

Common Coupling

Two or more modules exhibit common coupling if they refer to the same global data area - that is, to something that corresponds to a data store on a DFD or a “register” that must be shared by several processes.

External Coupling

Two or more modules exhibit external coupling if they share direct access to the same I/O device or are “tied to the same part of the environment external to software” in some other way.

 うーん。言っていることはWikiPediaとそう違ってはいません。

 日本語版WikiPediaを英語版の忠実な僕とすると、日本語圏の認識と英語圏の認識が相違しているわけです。興味深い。

どちらが正しいんだろう?

 私の感覚では英語の内容だと思うんですよね。

 外部結合は、例えば共通のI/Oインタフェースを参照する等、グローバル変数とは異なる同一のリソースを参照しているケースですが、この場合、

  • 参照している内容、手順は第三者から明確に認識可能
  • 明文化された手順、規約に従えば他のモジュールからもアクセスできる

 と、ある一定の明確な規約のもとでリソースを参照しています。

 いわば明示的な約束に基づいて(外から分かる形で)リソースを共有しているわけです。

 一方で共通結合は、グローバル変数を参照していることだけが分かっているだけであって、その変数がいつ、どのようにアクセスされるかは、参照関係にあるモジュール間だけの暗黙的な約束になっています。

 暗黙な約束を持つ、ということは、モジュールは相互にどのようなアクセスをしているのかを知っていなければならない、ということであり、その約束は外部から認識できない、ということ。

 要は、『共通の秘密を持っている方が結合度が高い』ということ。

 察するに、日本語の誤認識は『データ結合』(構造のない引数)と『スタンプ結合』(構造を持つ引数)の差を、英語のリソースを確認せず、外部結合と共通結合に敷衍したことから発生したんじゃないかなぁと、あまり深く考えずに思ったりしましたが、真相はよく分かりませんし、割とどうでも良いですね。

まとめ

  • 誰かの話を聞いて、自然でない認識に至る場合は裏を取ったほうが良いですね。
  • 古くて定説化されていても、怪しければ英語に当たったほうが良いですね。
  • なぜそう位置づけられているのか、という理由は大事ですね。

 という話でした。