質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1257閲覧

ライブラリと結合度について

otnkbike

総合スコア3

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

3クリップ

投稿2022/04/05 10:46

Unityを使ってゲームを個人開発しています。

オブジェクト指向では、モジュール間の結合度が疎であるべきですが
例えばUnityでいうUniRxやOdinのような多くのコードで使われる外部ライブラリを導入すると、
ライブラリを導入している前提のコードになってしまうと思います。
また、色々なコードで使われる機能を自作ライブラリとして書き出した場合も同じように
便利ですがそのコードに依存しますよね。

そもそもUnityで書いたコード自体がUnityの環境を前提としてるのでバランス次第だとは思うのですが、
こういったライブラリの導入自体なるべくやめた方が良いのでしょうか。
また、外部ライブラリを導入するバランスはどのように考えているのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2022/04/05 11:32 編集

多分、一般的に言われている「結合度が疎」と質問者さんの「結合度が疎」はそれぞれ別の解釈なのではないかと思います。一旦、「どういうのを『結合度が疎』なのか」の定義を書いた方がいいかもしれません。 意図が違っていると答えまで変わってきますから。 ちなみに間違うこと自体は恥ではないです。
otnkbike

2022/04/05 12:04

回答ありがとうございます。 自分の理解では「外部クラスの変更によって自身を変更するケースが少ない状態」を結合度が疎であると考えていました。 もし間違いがありましたらご指摘いただけると助かります。
BeatStar

2022/04/05 12:42 編集

あ、解釈は合っていますね。微妙に違う気がしますが。
guest

回答1

0

ベストアンサー

つまり、「複数のクラスなんかを使ったら変更が面倒…」っていう意味ですかね? 本題は。

そういう意味であれば「問題はない」と思います。というかもし質問者さんが危惧しておられることが前提となっていたらC#でいう System.Conole.Writeメソッド, C言語でいうprintf関数ですら使えないはずです。そういうメソッドや関数は言語が提供しているというより、ライブラリとして提供されています。

単に「○○ライブラリが~」とかを意識しているのかしていないのかの違いだけです。
よって、本題通りであれば「何も実装できない」ことになってしまいます。
だって、二つのメソッド(C言語だと関数)を作ってmethod1がmethod2を呼び出す…みたいな実装になっているだけでも、「もしこのmethod2の内部処理が変更されて、"ファイルから一行読み込む"だったのが"バイナリファイルに記述されているデータの一部を取り出す"とかになったとかで戻り値まで変更になった」とかもあり得ますよね。(さすがにこの例はあり得ないけど、これレベルの変更があっても不思議ではない)

(本題の意味で)結合度を低くしようとするとやっぱりmethod2もmethod1も作れないし、作れたとしてもmethod1にべた書きになる。というかC#の場合はMainメソッドがすでにあるから別のメソッドを作っただけで結合度が…

一般的に言われている「結合度が低」(今回は「疎」と言っている)は「クラスの構造が変更されても呼び出し側には影響がない」のと「メソッドの引数や戻り値、メソッドの基本的な内容が分かっていればいい」ですね。

たとえばここを参考にすると、

(スタンプ結合)

userIdだけあれば事足りそうですが、Userインスタンスを渡してしまっています。別に問題ないように見えますがUserインスタンスのデータ構造に依存してしまっているのが問題です。

(データ結合)

参照するモジュールで使うデータだけを、個々の引数で受け渡ししている状態を指します。引数が多くなるとモジュールを参照するために、自分が必要じゃないデータを渡す必要があったりします。

とあります。スタンプ結合、結合度は下(低)から数えて二番目ぐらいでしょうか、この結合ではクラスのデータ構造(どういうプロパティを持っているかとか)を知らないといけないし、不要なデータも含んでいます。

データ結合(一番下)はそのメソッドが使うデータだけを渡していますから、データ構造を知らなくても必要なものだけ知っていればいいのです。引数として渡すデータを構造体とかにしてそれを受け渡すとかの場合は必要なものだけなら結合度は低のようですね。

つまり、「クラスの(内部の)データ構造とかが変更される場合」や「メソッドの処理内容等が変更される場合」に呼び出し側にまで修正が及ぶかどうかだと思います。

Unityとかで提供されているクラス等が変更される可能性は無いとは言いませんが、それを言い出したらそもそもC言語とかで使えるprintf関数みたいな言語レベルでサポートされていると思われているクラス等ですら使えませんよ。

こういったライブラリの導入自体なるべくやめた方が良いのでしょうか。

今回の意味でいえば『問題ない』です。ただし、ライセンス的に不可能だったり、チーム開発とかでの取り決めとかで見送るとかはありそうですね。

投稿2022/04/05 12:57

BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otnkbike

2022/04/05 14:46

回答ありがとうございます。大変わかりやすかったです! 確かにそもそも標準モジュールすら変更される可能性もあるわけで、 そこまで気にする必要性は薄いですよね。 自分の結合度に対してのとらえ方が極端になってしまっていたので もう少し場面に合わせて柔軟に考えられるよう取り組んでいきたいです。 ありがとうございました。
otnkbike

2022/04/05 14:59

あと、自分の捉え方の誤解として呼び出し側と呼び出される側をまぜて考えてしまっていました。 呼び出される側から組み上げるように結合を考えて設計していくものなのですね。 その点も大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問