0

私は、ファイルの低レベルデータ、つまりマッピングなどを読み取り、python の組み込み sqlite API を使用して結果を sqlite DB に保存できる小さなツールに取り組んでいます。

解析されたファイル データには、次の 3 つのクラスがあります。

class GenericFile: # general file class 
    # bunch of methods here
    ...
class SomeFileObject_A: # low level class for storing objects of kind SomeFileObject_A
    # bunch of methods here
    ...
class SomeFileObject_B: # low level cass for storing objects of kind SomeFileObject_A
    # bunch of methods here
    ...

sqlite インターフェイスは別のクラスとして実装されています。

class Database:
    def insert(self, object_to_insert):
    ...
    def _insert_generic_file_object(self, object_to_insert):
    ...
    def _insert_file_object_a(self, object_to_insert):
    ...
    def _insert_file_object_b(self, object_to_insert):
    ...
    # bunch of sqlite related methods

オブジェクトをDBに挿入する必要があるときは、db.insert(object).

isinstanceメソッドで使用することをお勧めしますinsert。オブジェクトごとに適切なメソッドを明示的に呼び出す必要がなく、挿入されたオブジェクトを処理するためです。これはよりエレガントに見えます。しかし、 をさらに読んだ後isinstance、私の設計はあまり良くないのではないかと疑い始めました。

ジェネリックinsertメソッドの実装は次のとおりです。

class Database:
    def insert(self, object_to_insert):
        self._logger.info("inserting %s object", object_to_insert.__class__.__name__)
        if isinstance(object_to_insert, GenericFile):
            self._insert_generic_file_object(object_to_insert)
        elif isinstance(object_to_insert, SomeFileObject_A):
            self._insert_file_object_a(object_to_insert)
        elif isinstance(object_to_insert, SomeFileObject_B):
            self._insert_file_object_b(object_to_insert)
        else:
            self._logger.error("Insert Failed. Bad object type %s" % type(object_to_insert))
            raise Exception
        self._db_connection.commit()

したがって、isinstace私の場合は避けるべきであり、そうする必要がある場合、ここでより良い解決策は何ですか?

ありがとう

4

1 に答える 1

1

OO の基本原則の 1 つは、明示的なスイッチをポリモーフィック ディスパッチに置き換えることです。あなたの場合、解決策は二重ディスパッチを使用することであるため、どのメソッドを呼び出すFileObectかを知る責任があります。Database

class GenericFile: # general file class 
    # bunch of methods here
    ...
    def insert(self, db):
        return db.insert_generic_file_object(self)


class SomeFileObject_A: # low level class for storing objects of kind SomeFileObject_A
    # bunch of methods here
    ...
    def insert(self, db):
        return db.insert_file_object_a(self)


class SomeFileObject_B: # low level cass for storing objects of kind SomeFileObject_A
    # bunch of methods here
    ...
    def insert(self, db):
        return db.insert_file_object_b(self)


class Database:
    def insert(self, obj):
        return obj.insert(self)
于 2015-12-29T08:57:51.553 に答える