Сколько классов мне следует поместить в один файл?[закрыто]

StackOverflow https://stackoverflow.com/questions/106896

  •  01-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Файл Python называется «модулем», и это один из способов организовать ваше программное обеспечение так, чтобы оно имело «смысл».Другой — это каталог, называемый «пакетом».

Модуль — это отдельная вещь, которая может иметь один или два десятка тесно связанных классов.Хитрость в том, что модуль — это то, что вы импортируете, и вам нужно, чтобы этот импорт был совершенно понятен людям, которые будут читать, поддерживать и расширять ваше программное обеспечение.

Правило такое: модуль — это единица повторного использования.

Вы не можете легко повторно использовать один класс.Вы сможете без проблем повторно использовать модуль.Все в вашей библиотеке (и все, что вы загружаете и добавляете) представляет собой либо модуль, либо пакет модулей.

Например, вы работаете над чем-то, что читает электронные таблицы, выполняет некоторые вычисления и загружает результаты в базу данных.Как вы хотите, чтобы ваша основная программа выглядела?

from ssReader import Reader
from theCalcs import ACalc, AnotherCalc
from theDB import Loader

def main( sourceFileName ):
    rdr= Reader( sourceFileName )
    c1= ACalc( options )
    c2= AnotherCalc( options )
    ldr= Loader( parameters )
    for myObj in rdr.readAll():
        c1.thisOp( myObj )
        c2.thatOp( myObj )
        ldr.laod( myObj )

Думайте об импорте как о способе организации вашего кода в виде концепций или фрагментов.Сколько именно классов содержится в каждом импорте, не имеет значения.Важна общая организация, которую вы изображаете в своих import заявления.

Другие советы

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

Мне нравится модель Java по следующей причине.Размещение каждого класса в отдельном файле способствует повторному использованию, облегчая просмотр классов при просмотре исходного кода.Если у вас есть группа классов, сгруппированных в один файл, другим разработчикам может быть неочевидно, что там есть классы, которые можно повторно использовать, просто просматривая содержимое проекта. структура каталогов.Таким образом, если вы считаете, что ваш класс можно использовать повторно, я бы поместил его в отдельный файл.

Это полностью зависит от того, насколько велик проект, насколько длинны классы, будут ли они использоваться из других файлов и так далее.

Например, я довольно часто использую серию классов для абстракции данных, поэтому у меня может быть 4 или 5 классов длиной всего в 1 строку (class SomeData: pass).

Было бы глупо разбивать каждый из них на отдельные файлы, но, поскольку они могут использоваться из разных файлов, поместите все это в отдельный файл. data_model.py файл имел бы смысл, поэтому я могу сделать from mypackage.data_model import SomeData, SomeSubData

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

Вам следует структурировать их, чтобы вы это сделали. from mypackage.database.schema import MyModel, нет from mypackage.email.errors import MyDatabaseModel - если то, откуда вы импортируете что-то, имеет смысл и файлы не состоят из десятков тысяч строк, вы все организовали правильно.

А Документация по модулям Python содержит некоторую полезную информацию по организации пакетов.

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

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

С другой стороны, когда размер любого файла .java или .py превышает 700 строк, я начинаю постоянно раздражаться, пытаясь вспомнить, где находится «этот конкретный бит».

Похоже, что в Python/Jython циклическая зависимость операторов импорта также играет роль:если вы попытаетесь разделить слишком много взаимодействующих базовых строительных блоков на отдельные файлы, это «ограничение»/«несовершенство» языка, похоже, вынудит вас группировать вещи, возможно, довольно разумным образом.

Что касается разделения на пакеты, я точно не знаю, но я бы сказал, что, вероятно, одно и то же правило раздражения и возникновения счастливой структуры работает на всех уровнях модульности.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top