Ile klas powinienem umieścić w jednym pliku? [Zamknięte]


274

Jestem przyzwyczajony do modelu Java, w którym możesz mieć jedną klasę publiczną na plik. Python nie ma tego ograniczenia i zastanawiam się, jaka jest najlepsza praktyka w organizowaniu zajęć.


8
Myślę, że jest to rozsądne pytanie, biorąc pod uwagę wymagania i konwencje innych języków, a odpowiedź brzmi „<zdefiniuj moduły i pakiety Pythona> i poza tym, że jest to kwestia preferencji (/ opinii)” - ta odpowiedź sama w sobie nie jest opinią
david.libremone

Odpowiedzi:


333

Plik Python nazywa się „modułem” i jest to jeden ze sposobów porządkowania oprogramowania, tak aby miał „sens”. Kolejny to katalog zwany „pakietem”.

Moduł to odrębna rzecz, która może mieć jeden lub dwa tuziny blisko spokrewnionych klas. Sztuczka polega na tym, że moduł jest czymś, co zaimportujesz, i potrzebujesz, aby ten import był całkowicie sensowny dla osób, które będą czytać, konserwować i rozszerzać twoje oprogramowanie.

Zasada jest następująca: moduł jest jednostką ponownego użycia .

Nie możesz łatwo ponownie użyć jednej klasy. Powinieneś być w stanie ponownie użyć modułu bez żadnych trudności. Wszystko w bibliotece (i wszystko, co pobierasz i dodajesz) jest modułem lub pakietem modułów.

Na przykład pracujesz nad czymś, co czyta arkusze kalkulacyjne, wykonuje obliczenia i ładuje wyniki do bazy danych. Jak ma wyglądać Twój główny program?

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 )

Pomyśl o imporcie jako sposobie organizowania kodu w koncepcje lub fragmenty. Dokładna liczba klas w każdym imporcie nie ma znaczenia. Liczy się ogólna organizacja, którą przedstawisz w swoich importwypowiedziach.


24
Haha, podoba mi się „sens” w cytatach.
cdleary

27
@cdleary: Zmysł jednej osoby jest szaleństwem innej osoby. Zwykle można zdefiniować sensowne moduły. Jednak w dużej aplikacji zawsze istnieje wiele wymiarów analizy, a jedna osoba dzieli włosy na krojenie i krojenie funkcji przez inną osobę.
S.Lott,


4
Odpowiedź, która tak naprawdę nie odpowiada na pytanie, co z czytelnością, trudno jest odczytać pliki zawierające więcej niż 500 wierszy.
Vedmant,

38

Ponieważ nie ma sztucznego limitu, tak naprawdę zależy to od tego, co jest zrozumiałe. Jeśli masz grupę dość krótkich, prostych klas, które są logicznie pogrupowane razem, wrzuć kilka. Jeśli masz duże, złożone klasy lub klasy, które nie mają sensu jako grupa, przejdź do jednego pliku na klasę. Lub wybierz coś pomiędzy. Refaktoryzuj, gdy wszystko się zmienia.


23

Zdarza mi się lubić model Java z następującego powodu. Umieszczenie każdej klasy w osobnym pliku ułatwia ponowne użycie, ułatwiając przeglądanie klas podczas przeglądania kodu źródłowego. Jeśli masz grupę klas zgrupowanych w jednym pliku, inni programiści mogą nie być oczywiste, że istnieją klasy, których można użyć ponownie, przeglądając strukturę katalogów projektu . Dlatego jeśli uważasz, że twoja klasa może być ponownie wykorzystana, umieściłbym ją we własnym pliku.


2
Całkowicie się z tobą zgadzam. Posiadanie kilku klas publicznych w jednym pliku jest sprzeczne z intuicją i sprawia, że ​​kod jest trudny do uchwycenia, tak jak ktoś chce ukryć strukturę i ma wrażenie, że jest tandetny. Zwłaszcza jeśli pochodzisz z Javy do Pythona.
WebComer,

Zwłaszcza jeśli pochodzisz z Javy do Pythona.
Rzucali

14

Zależy to całkowicie od tego, jak duży jest projekt, jak długo trwają klasy, czy będą używane z innych plików i tak dalej.

Na przykład dość często używam serii klas do abstrakcji danych - więc mogę mieć 4 lub 5 klas, które mogą mieć tylko 1 linię długości ( class SomeData: pass).

Głupio byłoby podzielić każdy z nich na osobne pliki - ale ponieważ można ich używać z różnych plików, umieszczenie ich wszystkich w osobnym data_model.pypliku miałoby sens, więc mogę to zrobićfrom mypackage.data_model import SomeData, SomeSubData

Jeśli masz klasę z dużą ilością kodu, być może przy niektórych funkcjach, z których korzysta, dobrym pomysłem byłoby podzielenie tej klasy i funkcji pomocniczych na osobny plik.

Powinieneś je tak ustrukturyzować, żebyś to robił from mypackage.database.schema import MyModel, a nie from mypackage.email.errors import MyDatabaseModel- jeśli importujesz rzeczy z sensu, a pliki nie mają dziesiątek tysięcy linii, poprawnie to zorganizowałeś.

Dokumentacja modułów Python zawiera przydatne informacje na temat organizowania pakietów.


1
uszkodzony link do dokumentacji modułów Python. Może sekcja 6.4 Moduły. Pakiety są teraz zamierzonym łączem?
cod3monk3y

9

Rozpadam się na części, gdy denerwuje mnie zaraźliwość plików i kiedy pożądana struktura powiązań zaczyna się naturalnie pojawiać. Często te dwa etapy wydają się zbieżne.

To może być bardzo denerwujące, jeśli rozdzielisz rzeczy zbyt wcześnie, ponieważ zaczynasz zdawać sobie sprawę, że wymagane jest zupełnie inne uporządkowanie struktury.

Z drugiej strony, gdy jakikolwiek plik .java lub .py dociera do ponad 700 linii, zaczynam się denerwować, próbując przypomnieć sobie, gdzie jest „ten konkretny bit”.

W przypadku Pythona / Jythona zależność cykliczna instrukcji importu również wydaje się odgrywać rolę: jeśli spróbujesz podzielić zbyt wiele podstawowych bloków konstrukcyjnych na osobne pliki, to „ograniczenie” / „niedoskonałość” języka wydaje się zmuszać do grupowania rzeczy, być może w dość rozsądny sposób.

Jeśli chodzi o podział na pakiety, to tak naprawdę nie wiem, ale powiedziałbym, że prawdopodobnie ta sama zasada irytacji i pojawienia się szczęśliwej struktury działa na wszystkich poziomach modułowości.


6

Powiedziałbym, aby umieścić w tym pliku tyle klas, ile można logicznie pogrupować, nie czyniąc go zbyt dużym i złożonym.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.