スポンサーリンク

コードが書ける!数式が書ける!AAが書ける!スタンプが貼れる!

無料の匿名掲示板型SNS「このはちゃんねる

新規会員募集中!

プログラミングにおける依存関係の設計

290, 2020-02-10

目次

依存関係とは

AがBの変更の影響を受けるとき、AはBに依存していると言えます。

A -> B

プログラミングではモジュールを作ることが多いと思います。
モジュールとは、ファイルです。
そして、そのファイ内で別のモジュールをインポートする。

たとえばAというモジュール内でBというモジュールをインポートするとき、AというモジュールはBというモジュールに依存しています。

# Aというモジュールで
import B # Bというモジュールをインポートする

依存するとはどういうことか

依存するとはどういうことでしょうか。
先ほども書いたように依存とは、依存元が依存先の変更の影響を受けるということです。
たとえばstringモジュールを作って、stringモジュール内の関数lowerをインポートしたとします。

from string import lower

この時、このファイルはstringモジュールの変更の影響を受けます。
例えばlower関数の名前を変更してto_lowerにしたとします。
そうすると↑のコードはエラーになります。これが依存元が依存先の影響を受けるということになります。

このことから、依存するということは、コストと言えそうです。
依存が少なければ少ない方が変更の影響を受けにくくなります。

依存しないほうが良いのか?

ということは、モジュールは極力、他のモジュールに依存しないほうがいいのでしょうか?
極論を言ってしまえばそうです。
ここら辺が言語の標準ライブラリが、その言語の生産性に大きく関係している要因なのですが、依存先はできるだけ標準ライブラリに留めたほうが使いまわしのいいモジュールになると言えます。

しかし、現実はそうはいきません。理想論はあくまでそうですが、実際の開発では外部ライブラリを使用することが多く、そんなことは言ってられません。

依存しないほうが使いまわしの良いモジュールが作れるが、実際は依存せずには開発できない。
ということになります。

依存のデメリットを減らす

以上のことから、依存のデメリットを減らす必要があることがわかります。
依存のデメリットは、ライブラリ、モジュールの設計思想によるところが大きいです。

別名

たとえば先ほどのstringモジュールを考えてみましょう。
先ほどの例ではlower関数の関数名の変更の影響によってエラーが発生しました。
これを避けるにはどういう工夫が必要でしょうか?

1つの答えが、lower関数とは別にto_lower関数をもう一つ作る、ということです。
そしてlower関数にはコメントで@deprecatedを付けます。これは「もう使うなよ」というコメントです。

これは標準ライブラリ等でよく使われるテクニックの1つです。
こうすればエラーは発生せず、モジュールの使用側の変更を日を追って進めていけばいいことになります。

クッション

もう1つの方法はクッションを設けることです。
先ほどのstringモジュールの例では直接stringモジュールをインポートしていましたが、これをやめてmystringという別のモジュールをインポートします。

from mystring import lower

mystringモジュールのlower関数内ではstringモジュールのlower関数を呼び出しています。
このように、変更が発生するであろうモジュールとの間に、ひとつクッションになるモジュールを挟むことで変更の影響を直接伝播しないようにします。
この状態でstringモジュールのlower関数をto_lowerに変更しても、mystringモジュールのlower関数内で使っているlower関数を修正すれば、mystringモジュールをインポートしているモジュールは修正をしなくて済みます。

このクッションは、ただのアイデアですが、変更の影響を直接伝播しないという点で有効だと言えます。
しかし、モジュールを余計に1つ作るのですから、コストは上がる方法です。
そのコストと、依存のコストを天秤にかける必要があるでしょう。

おわりに

依存関係はコストを生みますが、それは切っても切れない関係と言えます。
しかしコストを受け入れ、積極的に設計に取り入れることである程度、デメリットを和らげることが出来ます。
今日からレッツ依存関係、設計に取り入れましょう。

おしまい

投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。

スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク