Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przestrzenie nazw po raz ostatni...
Forum PHP.pl > Forum > PHP > Object-oriented programming
starach
Cześć,

Mam FW podobny w miarę strukturą katalogów do Kohany. Jakiś czas temu dodałem w nim przestrzenie nazw. Teraz naszła mnie taka refleksja czy zrobiłem to dobrze. A mianowicie czy nie przedobrzyłem z ich długością.
  1. namespace Enforcer\System\Libraries;
  2. use \Enforcer\System\Base\Application\Context;
  3.  
  4. abstract class Data implements Context\ImplanterInterface { }

Przykładowa przestrzeń nazw dla controllera pluginu:
  1. namespace \Starach\Enforcer\Plugins\Pages\Controllers;
  2.  
  3. class Pages extends \Enforcer\System\Libraries\Controller\ContextImplanter { }

Tak się zastanawiam czy nie lepiej byłoby skrócić przestrzeń nazw i przedłużyć nazwy klas.
Na przykład:
  1. namespace \Starach\Enforcer\Plugins\Pages;
  2.  
  3. class ControllersPages {}
  4. class ControllersPageEdit {}
  5. class ControllersPageView {}
  6. class LibrariesPages {}
  7. // edit->
  8. // obecnie
  9. namespace Enforcer\System\Libraries\Client\Language;
  10. class Collection implements \Iterator { }
  11. // zmiana na
  12. namespace Enforcer\System;
  13. class LibrariesClientLanguageCollection implements \Iterator { }
  14. // lub
  15. namespace Enforcer\System\Libraries;
  16. class ClientLanguageCollection implements \Iterator { }
  17. // <-edit
  18. // I tak dalej.


Co o tym myślicie?
smentek
Zwracasz się do ludzie w stylu: "Wojtku synu Piotra z miasta Wrocław w kraju Polska na planecie Ziemia" czy po prostu "Wojtku" ? biggrin.gif
Crozin
@smentek: Co to ma mieć niby do rzeczy?

Co do tematu... jakieś strasznie dziwne masz te nazwy - chociaż ciężko jest to obiektywnie ocenić, bo nie ani za co połowa tego kodu odpowiada, ani jak wygląda całość. Jednak:

1. To "Enforcer" to nazwa Twojego FW? Jeśli tak to dobrze, że jest to pierwszy element nazwy. Jeżeli nie, to zawsze dodawaj sobie nazwę projektu jako początek nazwy.
2. Jakieś człony typu "System" czy "Libraries" wydają mi się niepotrzebne - ale jak już napisałem: nie znam reszty kodu więc nie mogę tego jednoznacznie określić. Być może ich użycie jest w Twoim przypadku jak najbardziej poprawne
3. Każdy plugin jednak dobrze by było jakby miał osobną przestrzeń na swoje kontrolery, swoje widoki swoje coś tam i jeszcze coś innego
starach
@smentek: Co prawda nie ma to tutaj zastosowania, ale analogia jest jak najbardziej trafna. biggrin.gif

@Crozin: Całość jest strukturą bardzo bardzo podobną do Kohany.

Kod
- applications
| - cli
| - blog
| - etc.
- plugins
| - Starach
  | - Pages
    | - controllers
    | - libraries
    | - models
    | - views
- system
| - base
  | - Router
  | - Plugins
  | - Loader
  | - bootstrap.php
| - controllers
| - etc.

etc.

Zastanawiam się czy nie przedobrzyłem przy podziale na przestrzenie nazw. Na dobrą sprawę zastanawia mnie teraz tylko poniższa sprawa.
  1. namespace Enforcer\System\Libraries\Client\Language;
  2. class Collection implements \Iterator { }
  3. // W chwili obecnej jest tak jak wyżej
  4. // Czy nie powinienem stosować jednak poniższego zapisu? Zacząłem odnosić wrażenie że poniższy podział na segmenty przestrzeni nazw jest wystarczający.
  5. namespace Enforcer\System\Libraries;
  6. class ClientLanguageCollection implements \Iterator { }
Jak sądzisz?

Innymi słowy chciałbym znaleźć jakąś regułę dotyczącą granic dzielenia klas na paczki.
Crozin
Cytat
@smentek: Co prawda nie ma to tutaj zastosowania, ale analogia jest jak najbardziej trafna.
Podał po prostu "ludzkie wytłumaczenie" idei przestrzeni nazw - dlatego zapytałem co to ma do rzeczy.

Cytat
Jak sądzisz?

Innymi słowy chciałbym znaleźć jakąś regułę dotyczącą granic dzielenia klas na paczki.
Bardzo ciężko odpowiedzieć nie znając całości (większego fragmentu) kodu. Jakiś sztywnych reguł nie ma. Jeżeli w Enforcer\System\Libraries miałbyś mieć 5 klas to ok, jeżeli 250 to już niezbyt to dobre będzie. Innymi słowy: to zależy (piszę to chyba 3. raz dziś :]).

Powinieneś się raczej kierować jakąś tam logiką przy tym podziale. W każdej przestrzeni powinny znaleźć się tylko powiązane tematycznie klasy/interfejsy. Jeżeli miałbyś skończyć na 10 przestrzeniach po dwie klasy mógłbyś pomyśleć o jakiejś bardziej ogólnej nazwie i zebrać to w jedną paczkę - oczywiście tylko w przypadku, gdyby wszystko dotyczyło tego samego "tematu".
starach
No fakt od tego jest niby UML, ale FW w założeniu ma być bardzo modularny żeby poszczególne elementy można było rozwijać autonomicznie. Ciężko jest zaplanować każdą funkcjonalność - a co za tym idzie klasy - we wtyczce która z założenia ma być rozwijana przez choćby nawet tylko rok. Dlatego chyba będę stosował podejście nadmiarowe. Czyli muszę się jakoś pogodzić z nadwyżką segmentów w przestrzeniach nazw.

Zyx
To nie jest kwestia przestrzeni nazw, tylko budowy Twojego frameworka. Teraz masz:

  1. namespace \Starach\Enforcer\Plugins\Pages\Controllers;
  2.  
  3. class Pages{ ... }


A gdybyś nie używał przestrzeni nazw, miałbyś pewnie

  1. class Starach_Enforcer_Plugins_Pages_Controllers_Pages{ }


U siebie staram się wszystko rozplanować tak, by drzewo katalogowe miało głębokość dochodzącą do 4 poziomów (gdzie poziom 4 to klasa), w ekstremalnych przypadkach dobijając do 5.
starach
Problem w tym, że nie mam żadnego pomysłu jak je skrócić. Jak mówiłem mój FW bazuje na ideologii Kochany. Jakbyś dodawał do niej przestrzenie nazw to jakbyś to zrobił?

edit>
Teoretycznie można zamienić Enforcer_Plugins na EnfPlugin, ale jest to raczej taki plaster na dupę, a nie jakaś rewolucyjna zmiana. Wszystkie nazwy byłyby krótsze przynajmniej o jeden fragment gdyby nie hierarchiczność, ale może masz jakiś pomysł jak wyciąć jeszcze z jeden fragment.
Crozin
Cytat
Jakbyś dodawał do niej przestrzenie nazw to jakbyś to zrobił?
W ogóle bym się nie brał do pracy na tym czymś. winksmiley.jpg

Nam jest bardzo ciężko określić jak mógłbyś to przerobić, bo... bo nie znamy kodu, który prawdopodobnie trzebaby było przepisać (częściowo). Jedyne co mi się rzuca w oczy to podział na System i Plugins, który IMHO jest niepotrzebny, albo inaczej... mało wygodny. Tutaj mógłbym polecić rozwiązanie na kształt Symfony2 w postaci Bundles (jakoś żadne polskie tłumaczenie mi tutaj nie pasuje). Wtedy potworki typu: \Starach\Enforcer\Plugins\Pages\Controllers\Page. uprościły by się do czegoś w stylu: \Starach\PagesBundle\Controllers\Page. Przeskok z pięciu do trzech segmentów nazwy przestrzeni.
starach
W ten sposób wywaliłeś Crozin część identyfikacyjną pluginu. Fakt faktem że można by to uprościć usuwając ją, ale wtedy klasa ładująca pluginy musiałaby sprawdzać każdą klasę - hmm możne z wyjątkiem ... dobra nie wszystkie. Dzięki zaraz zabiorę się za zmianę nazw na \Starach\Pages\* np. Controllers pozostaje tylko jeszcze kwestia aplikacji i systemu

Enforcer\Application\Controllers
Enforcer\System\Base\Application

Chociaż w sumie nie są one takie straszne i mieszczą się na dobrą sprawę w zasadzie ( max. 4 segmenty )

Dzięki.

Crozin
Cytat
W ten sposób wywaliłeś Crozin część identyfikacyjną pluginu.
Między innymi o to chodziło. winksmiley.jpg
Cytat
Fakt faktem że można by to uprościć usuwając ją, ale wtedy klasa ładująca pluginy musiałaby sprawdzać każdą klasę - hmm możne z wyjątkiem ... dobra nie wszystkie.
Akurat sposób z Sf2, który zaproponowałem działa na trochę innej zasadzie - nie wyszczególnia się w nim czegoś takiego jak "system" i "pluginy", mimo, iż takowe w sumie istnieją. Rozwiązuje to też problem z Twoim "system".

Przeczytaj sobie na stronach Sf2 - mi się nie chce rozpisywać. Nie mówię, żebyś Copy&Paste robił, ale abyś spojrzał na problem z nieco innej perspektywy.
manro
Cytat
Mam FW podobny w miarę strukturą katalogów do Kohany. Jakiś czas temu dodałem w nim przestrzenie nazw...

Wydaje mi się, że za bardzo skupiłeś się tutaj na odwzorowaniu struktury katalogów na namespacy. Nie wydaje mi się aby to miało jakikolwiek sens.
Przecież w własnym FW raczej nie będziesz miał kolizji nazw dlaczego nie zastosować jednego poziomu
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.