Упрощение сложной иерархии классов - PullRequest
0 голосов
/ 19 августа 2010

С целью максимального повторного использования кода я создал довольно сложную иерархию классов для своего кода Python. Это выглядит примерно так:

class ElectionMethod
    class IterativeMethod
        class SNTV
        ...
    class NonIterativeMethod
        class OrderDependent
            class CambridgeSTV
            ...
        class OrderIndependent
            class WIGM
                class ERS97STV
                ...
            class Recursive
                class MeekSTV
                ...

Только листья иерархии классов когда-либо создаются в объектах. Это служит своей цели максимизации повторного использования кода, но сам код сложен (некоторые классы имеют около 20 методов) и, учитывая множество уровней, может потребоваться много времени, чтобы найти, где что-то реализовано.

Я попытался извлечь куски функциональности и поместить эту функциональность в отдельный объект, но я не нашел хорошего способа сделать это, так как почти вся функциональность зависит от общих данных. То есть, я могу переместить некоторый код в другой объект, но он должен обратиться к большой сложной иерархии, чтобы получить данные, которые ему нужны, чтобы в действительности это не инкапсуляция.

У кого-нибудь есть советы, как сделать это более управляемым?

Ответы [ 3 ]

2 голосов
/ 19 августа 2010

Если единственная сложность - найти, где что-то реализовано, возможно, вам не нужно проводить рефакторинг.Вместо этого ищите расширения для вашего текущего редактора или переключайтесь на тот, который поддерживает переход к определениям.

Например, emacs с установленным файлом познакомится с , когда курсор помещается, переход к определениямповерх имени объекта и нажимается Ctrl-c g.

Я уверен, что есть аналогичные приемы, если вы используете vi / vim.

1 голос
/ 19 августа 2010

Мульти-метод с, в зависимости от вашей архитектуры, может быть еще одним допустимым решением проблемы такого рода. Идея состоит в том, чтобы сделать методы уровня модуля функциями, которые могут действовать на любом экземпляре класса, который было бы желательно передать им. Вот еще одна ссылка, которая рассматривает их как альтернативу множественному наследованию . Это их общие функции, но идея похожа. В нем также обсуждается недокументированная встроенная реализация python.

Если бы вы могли переместить все, что не имеет отношения к установке или получению значений конкретного экземпляра из класса, в функции уровня модуля и просто иметь код уровня класса, связанный с реализацией интерфейса изменения состояния / модификации, Возможно, вам даже не понадобятся мульти-методы.

0 голосов
/ 19 августа 2010

Это классическая проблема, поэтому нет универсального ответа (иначе это не было проблемой).Но есть несколько часто используемых решений.Один из них - SOLID принципы в дизайне.Таким образом, вам не нужно искать функциональность по уровням вашей иерархии, вы можете легко найти или реализовать ее в соответствующем элементе кода с единственной ответственностью.И если вам нужен доступ к некоторым общим данным, вы должны создать объекты, отвечающие за доступ к этим данным.

Проектирование по контракту и, в особенности, техника внедрения зависимостей, как правило, нуждается в некоторой поддержке фреймворка, поэтому ищите подходящую платформу 1006 *.

...