不必要にメソッドの引数にインスタンスを取るのは避けたほうがいいと感じる理由

開発でメソッドのテストをしていると、テストがしにくいと感じるときがある。そのように感じる原因の一つとして、メソッドの引数にインスタンスを取る設計になっていることがある。理由があればともかく、このような設計に不必要にしてしまうのは良くないと考える。
(必要であれば引数に取るようにするのはいいと考えるが、必要な例が思い浮かばない…)

なぜメソッドの引数にインスタンスを取るのは避けたほうがいいのか

メソッドの引数にインスタンスを取るのは避けたほうがいいと感じるのは、テストコードにインスタンス生成処理を余分に書かないといけないからである。

具体例として、以下のクラスUserとメソッドaddAgeを定義する(メソッドの内容に意味があるかはさておき)。

class User:
    id:int
    name:str
    email:str
    age:int

    def __init__(self, id, name, email, age):
        self.id = id
        self.name = name
        self.email = email
        self.age = age

def addAge(user1:User, user2:User):
    return user1.age + user2.age

これは、メソッドaddAgeの引数にインスタンスuser1とuser2を取っている。addAgeのテストをする場合、以下のテストコードを書く。

    user1:User = User(1, "鈴木", "suzuki@example.com", 20)
    user2:User = User(2, "佐藤", "satou@example.com", 24)
    self.assertEqual(addAge(user1.age, user2.age), 44)

このように、余分に2行分インスタンス生成処理を書かないといけなくなる。2行分くらいサクッと書いたらいいのにと言われたらそれまでだが、age以外のフィールドはインスタンスでは使われていないので、コードとしてやや冗長かと感じる。

では、メソッドの引数はどのような設計にするとよいのか

結論、メソッド内で使われる変数のみを引数に取るのがよいと考える。

上記メソッドaddAgeの場合、以下のように定義するのが良いと考える。

def addAge(user1_age:int , user2_age.int):
    return user1_age + user2_age

このように定義することで、テストコードは以下の通りとなる。

self.assertEqual(addAge(user1_age, user2_age), 44)

インスタンス生成処理がなくなった分、スッキリ。

この記事が気に入ったらサポートをしてみませんか?