さるへい備忘録

さるへいのやったことを綴っているブログです。基本的にテクノロジーの話題です。

連想配列を使うかクラスを定義してインスタンスを作るべきかみたいな話

最近、連想配列を使うべきかクラス定義してオブジェクトを作るかみたいなところで非常によく悩んでいます。

例えば、エラーとかだとわかりやすいのですが

def validate(params):
    errors = []
    result = True
    if is_bad_params(params):
        errors.append('is_bad_params')

    if is_invalid_params(params):
        errors.append('is_invalid_params')

    if errors > 0:
        result = False

    return {
        'errors': errors,
        'result': result
    }

みたいにエラーを返すことってよくあると思います。
上記みたいなパターンって色んな所でイレギュラーなパターンのエラー処理をたくさん含めてしまったり、
実は返り値がとある場所では force_valid みたいなパラメータがついてたりとか。
連想配列って便利ですけど便利すぎるんですよね。。。。

でも上記みたいなのを量産してると正直管理しきれません。そういった場合僕は以下みたいな感じにしてます。

# coding: utf-8


class ValidateResult(object):


    def __init__(self):
        self.errors = []
        self.result = False


def validate(params):
    result = ValidateResult()

    if is_bad_params(params):
        result.errors.append('is_bad_params')

    if is_invalid_params(params):
        result.errors.append('is_invalid_params')

    if not len(result.errors):
        result.result = True

    return result

実際、どっちもどっちじゃんって思う方もいらっしゃると思うのですが、プロダクトの規模が大きくなってくると上記みたいにふんわりと構造を制限するだけでコードの可読性が変わってきます。
エラー処理みたいな大量に使うコードは僕は上記みたいにクラス定義して使っていくのが良いと思ってます。
その上で、他にも共通処理もたせられたらもっと理想ですね。

しかし、クラスを定義するのはそれなりに時間がかかります。なぜならちゃんとした設計でやらないと連想配列を使う場合よりしんどいことになるからです。
なんとなくで構造を縛ってしまうと後々使いづらい構造になりかねません。ちゃんと時間をかけて熟考することが大事です。

まぁ、僕もどのくらい共通して使われる場合はクラスにするかみたいな勘所は正直全然ありません。
なんとなく思いつきで書いたコラムみたいな話でした。