モジュール結合度の指針の一つである、 スタンプ結合 はなぜ、スタンプというのでしょうか?気になるので調べてみました。切手かな?とか踏みつけるとか区分するとかいう動詞かな?とか考えたのですが、ハンコを意味するスタンプの意味であってるようです。
前提知識
- 構造体とは
フィールドだけでメソッドのないクラスのような物です。データクラスといってもいいかも知れません。
- レコードとは
データベースやデータ管理システムで使うデータの単位です。エクセルの行みたいなものです。
はじめに
スタンプ結合とは、レコード全部とか、構造体丸ごととか、たくさんデータが入ったクラスを丸ごと渡したりする方法です。
意味としては、渡す必要のないデータまで渡してしまってる関数の呼び出し方と考えてください。
意味は分かりましたね。
なぜスタンプ結合はスタンプというのか
調べたところ、昔の開発者はレコードのレイアウトが掘られたスタンプを作っており、仕様書を書くときに、使用してたようです。
昔と言っても、ペンと紙でプログラミングをしていた汎用機の時代です。いきなりキーボードでプログラムを書くというのが無かった時代の話です。
イメージとしてはこちらのハンコが近いです。
こんな風に、読書記録レコード(ここでは「タイトル」、「著者」、「出版」、「ジャンル」、「日付」のデータが含まれている)の概要を押して、中にデータを手書きしてたわけです。
https://www.creema.jp/item/11074339/detail
こちらを例に取りますと、ある関数が「タイトル」と「著者」しか使わないのに、そのスタンプのデータを丸ごと全部渡してしまうような呼び出し方、それをスタンプ結合と呼びます。
昔の仕様書では、スタンプのデータを全部渡す場合は、そのスタンプを押しつけて、これらのデータを全部渡す、と指示していたようです。
1 2 3 4 5 |
//スタンプ結合のイメージ 関数X( 読書記録レコード Rec ){ Print(Rec.タイトル) Print(Rec.著者) } |
スタンプ結合の何が悪いか?
「タイトル」と「著者」しか使わないのに、「タイトル」、「著者」、「出版」、「ジャンル」、「日付」、のデータを渡してしまうと、関数内で、「出版」、「ジャンル」、「日付」のデータが書き換えられてしまう可能性があります。
また、「出版」、「ジャンル」、「日付」の内容によって関数内の動きが違ってくる可能性もあります。
2つしか使わないのであれば、引数を二つにするべきです。
1 2 3 4 5 |
//スタンプ結合をデータ結合に変えたイメージ 関数X( タイトル title , 著者 author ){ Print(title) Print(author) } |
構造体を渡した方がいい場合
今は「タイトル」と「著者」の2つしか関数内で触らないけど、今後、その構造体やクラスのデータをいろいろいじる可能性が高い場合は、構造体やレコードをそのまま渡してしまえばいいと思います。
引数を複数渡しても、すべてデータを使用するのであれば、それはデータ結合です。複数データを渡していてもスタンプ結合とは言いませんのでご注意ください。