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

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

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

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

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

0
gaefan 19 Авг 2010 в 21:52

3 ответа

Лучший ответ

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

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

1
aaronasterling 19 Авг 2010 в 20:09

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

Например, в emacs с установленной веревочкой переходят к определениям, когда курсор находится над именем объекта и { {X0}} нажата.

Я уверен, что есть подобные трюки, если вы используете vi / vim.

2
Community 23 Май 2017 в 11:55

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

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

0
Community 23 Май 2017 в 12:19