![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 45 Pomógł: 0 Dołączył: 26.06.2010 Ostrzeżenie: (10%) ![]() ![]() |
Cześć,
ostatnio postanowiłem poćwiczyć sobie programowanie obiektowe. Na tym forum zdążyłem już wiele razy przeczytać, że jeden obiekt = jedno zadanie. Przejdźmy do rzeczy. Mam jakieś archiwum a w nim kilka plików .txt. Teraz chcę napisać skrypt, który rozpakuje to archiwum i zmieni rozszerzenie plików z .txt na .html, po czym spakuje je. Jak zrobić to, aby było poprawnie? Osobna klasa do rozpakowywanie i pakowania i osobna do zmiany rozszerzenia? Czy w takim wypadku klasa stosować dziedziczenie? Może macie inne, lepsze, bardziej poprawne rozwiązania? Rozumiem, że lepiej nie pakować tego do jednej klasy? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Zrób klasę Archiver, która będzie realizowała operacje extract i pack. Samą funkcjonalność tych operacji wydziel do klas ArchiveExtractor i ArchivePacker.
Ponadto napisz klasę w stylu File, do operacji na pliku. Operacji takich właśnie jak zmiana nazwy pliku. Gdzie chciałbyś tu upchnąć dziedziczenie? To wstępny pomysł. Szkic. Można go i zapewne trzeba, dopracować w zależności od Twoich potrzeb. Ten post edytował mike 17.10.2010, 18:13:37 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 45 Pomógł: 0 Dołączył: 26.06.2010 Ostrzeżenie: (10%) ![]() ![]() |
Cytat Zrób klasę Archiver, która będzie realizowała operacje extract i pack. Samą funkcjonalność tych operacji wydziel do klas ArchiveExtractor i ArchivePacker. Mam rozumieć, że do samej obsługi archiwów potrzebuję aż trzech klas? Archiver, która będzie wywoływać klasy ArchiveExtractor i ArchivePacker? Zrozum mnie jeśli to źle zrozumiałem, ale jakoś tych dwóch zdań nie mogę pojąć. Ja myślałem o czymś takim - klasa Archiver i w niej są dwie metody jedna pakuje druga rozpakowuje. |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Czasami dobrze jest projektować od końca, tj. od interfejsu:
Oczywiście to jest przykład najbardziej podstawowego archiwizatora. Nie uwzględniłem tutaj też bloków try/catch na wyjątki. Ten post edytował Crozin 17.10.2010, 18:34:43 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 45 Pomógł: 0 Dołączył: 26.06.2010 Ostrzeżenie: (10%) ![]() ![]() |
Try/catch póki co nie używam, bo nie wiem za bardzo jak, ale wydaje mi się, że można je zastąpić instrukcją warunkową lub die().
Teraz już mniej więcej wiem jak to podzielić, ale mam jeszcze jedno pytanie, gdzie wpakować usunięcie tego niespakowanego katalogu(będziemy mieli archiwum z plikami .txt, archiwum z plikami .html oraz katalog z plikami .html). Ja bym go dał do klasy zmieniającej rozszerzenie, dokładniej w __destruct mimo tego że folder ten powstał dzięki klasie Archive(chyba że jako osobny obiekt). |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Usunięcie zbędnego katalogu przy powyższym schemacie dajesz po prostu po utworzeniu archiwum. Ot pętla usuwająca wszystkie pliki, a na końcu usunięcie pustego katalogu.
Cytat Try/catch póki co nie używam, bo nie wiem za bardzo jak, ale wydaje mi się, że można je zastąpić instrukcją warunkową lub die(). Pomijając już fakt, że wyjątki w PHP są śmiechu warte. Nie, nie da się ich zastąpić w żaden cywilizowany sposób instrukcjami warunkowymi, a co do die()... wyjątki dopiero w ostateczności służą wywaleniu skryptu.
Ten post edytował Crozin 17.10.2010, 21:07:09 |
|
|
![]()
Post
#7
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Mam rozumieć, że do samej obsługi archiwów potrzebuję aż trzech klas? Archiver, która będzie wywoływać klasy ArchiveExtractor i ArchivePacker? W rzeczywistości ja napisałabym tu jeszcze więcej. Wspomniane wyżej zamieniłbym na interfejsy i dodał realizacje ZipArchiveExtractor, ZipArchivePacker.Dzięki czemu możesz osiągnąć dużą elastyczność w implementacji, choćby dzięki strategii, którą można wykorzystać aby wprowadzić później użycie RarArchiveExtractor, e.t.c. Skąd zdziwienie, że trzy klasy to dużo? Czemu uważasz to za problem? Małe klasy realizujące pojedynczą odpowiedzialność to coś do czego powinieneś dążyć. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 45 Pomógł: 0 Dołączył: 26.06.2010 Ostrzeżenie: (10%) ![]() ![]() |
Za problem tego nie uważam, ale przyznam, że wydaje mi się to sporo, pomimo tego, że rozumiem, że jedna klasa = jedno zadanie.
Dzięki za wszystkie wskazówki i zainteresowanie tematem. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 12:40 |