Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zasady pisania na forum Pro

Tematy na forum Pro mogą zakładać jedynie moderatorzy. W otwartych tematach może pisać każdy, kto ma coś fachowego do powiedzenia. Wszystkie posty nie wnoszące nic do tematu będą natychmiast usuwane, a ich autorzy dostaną ostrzeżenie.
Jeśli uważasz, że jakiś temat jest warty dyskusji na tym forum, zgłoś go w temacie Propozycje.

7 Stron V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> jak pisac jadro ?
hawk
post 12.04.2004, 15:08:53
Post #41





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


Cytat
jeszcze wroce do wypowiedzi HAWK'a

Nie zrozumieliśmy się. Wstawianie referencji do $GLOBALS ułatwia dostęp do odpowiedniego obiektu. Ułatwia aż za bardzo, tzn. coś się może do niego odwoływać z dowolnego miejsca w dowolnym pliku, i nie masz możliwości wymuszenia jakiegoś ograniczenia. W przypadku czystego OOP, musisz samemu zapodać jakiemuś obiektowi referencję do innego obiektu, aby mógł w ogóle z nim coś zrobić. Więc łatwiej jest kontrolować, gdzie dany obiekt jest używany.

A zalety podejścia obiektowego objawiają się, gdy obiektów jest dużo, kod trzeba modyfikować i nie pamięta się, gdzie dany obiekt był potrzebny. Aplikacje w php raczej nie osiągają setek klas i dziesiątek tysięcy linii kodu, więc można się tym nie przejmować i też działa.
Go to the top of the page
+Quote Post
Seth
post 12.04.2004, 15:11:52
Post #42





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

Ostrzeżenie: (0%)
-----


Cytat
jeszcze wroce do wypowiedzi HAWK'a
Cytat

wynika właśnie z tego, że wszystko ma dostęp do wszystkiego. A design obiektowy wymusza zastanowienie się, komu dać dostęp (referencję) do danego obiektu


hm, przyszlo mi na mysl, ze w sumie chyba nie ma sensu branie pod uwage dostepnosci. Przeciez chyba wszystkie zmienne sa dostepne w zmiennej $GLOBALS...
wiec jesli ja tworze sobie w obietk np: silnik, to w GLOBALS bedzie dostep do tej funkcji, ja tak to robie. Wiec czemu ktos kto nie ma dostepu do jednej klasy nie zdobedzie go ? zaden problem napisac

[php:1:5a2c012149]<?php
$nowy_obiekt = & $GLOBALS['nazwa_obiektu'];
?>[/php:1:5a2c012149]

?

W ten spsob nie stworzysz powiazan klas.
Po drugie to nie jest to zgodne z OOP - aby dawac dostep do wszystkich obiektow systemu wszystkim obiektom.
Nie kazdy obiekt powinen ingerowac - miec dostp - np do klasy ustawien, czy parsera konfiguracji.
Dotgo dochodzi bezpieczenstwo oraz wieksze prawdopodobienstwo, ze bedzie gdzies blad... i tak jak wczesniej wspomnial hawk: "Mało modyfikowalne. Jak już masz to zaimplementowane to zmiana rozwala cały kod. A np. treść metody możesz wymienić, byleby tylko dalej zwracała co trzeba."

Takie sa poprostu zasady, ktorych trzeba sie trzymac, aby wykorzystac OOP i nie polpelniac bleddow, ktore pozniej moga byc trudne do wykrycia.
Go to the top of the page
+Quote Post
Ace
post 12.04.2004, 17:51:37
Post #43





Grupa: Zarejestrowani
Postów: 216
Pomógł: 0
Dołączył: 9.08.2003
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


ok, zrozumialem, lecz nadal jest kwestia dostepu, ze zawsze dobiore sie do obiektu poprzez $GLOBALS... czy nie jest tak ?
Go to the top of the page
+Quote Post
Seth
post 12.04.2004, 18:10:03
Post #44





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

Ostrzeżenie: (0%)
-----


Tak, ale wlasnie to jest zlym nawykiem i nie trzymaniem sie OOP.
Go to the top of the page
+Quote Post
Balin
post 12.04.2004, 20:30:57
Post #45





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 14.05.2003

Ostrzeżenie: (0%)
-----


Czy dobrym pomyslem jest wg. was stworzenie klasy jadra, ktora tworzy instancje wszystkich obiektow (singletonow), bibliotek i sprawdza ew. skad zostalo przyslane rzadanie o instancje danego obiektu ? U mnie taka klasa wyglada mniej wiecej tak:

[php:1:8cbc7c0737]<?php
class Kernel
{
static private $arrInstances = array();

static function GetInstance( $strInstanceName = 'Kernel' )
{
if( empty( self::$arrInstances[$strInstanceName] ) )
{
self::$arrInstances[$strInstanceName] = new $strInstanceName;
}

return self::$arrInstances[$strInstanceName];
}

static function CreateDBInstance( $objDBConfig )
{
require_once( 'db_drivers/' . $objDBConfig->GetUsedDB() . '.class.php' );

if( empty( self::$arrInstances['DB'] ) )
{
self::$arrInstances['DB'] = new DB( $objDBConfig->GetHostName(), $objDBConfig->GetUserName(), $objDBConfig->GetPassword(), $objDBConfig->GetDBName() );
}

return self::$arrInstances['DB'];
}
}
?>[/php:1:8cbc7c0737]

i przykladowe uzycie w aplikacji:

[php:1:8cbc7c0737]<?php
class App
{
private $objDB = null;
private $objIO = null;
private $objConfig = null;
private $objSession = null;
private $objTemplate = null;
private $objTimer = null;

private $objPage = null;

function __construct()
{
$this->objTimer = Kernel::GetInstance( 'Timer' );
$this->objTimer->CreateTimer( 'main_timer' );

$this->objDB = Kernel::CreateDBInstance( Kernel::GetInstance( 'DBConfig' ) );
$this->objIO = Kernel::GetInstance( 'IO' );
$this->objConfig = Kernel::GetInstance( 'Config' );
$this->objSession = Kernel::GetInstance( 'Session' );
$this->objTemplate = Kernel::GetInstance( 'Template' );

$this->objPage = Kernel::GetInstance( 'Page' );
}
}
?>[/php:1:8cbc7c0737]

moze lepiej byloby to rozwiazac inaczej ? Czy w ogole warto tworzyc osobna klase reprezentujaca jadro systemu, czy moze umieszczac wszystko bezposrednio w kodzie aplikacji ?
Go to the top of the page
+Quote Post
Ozzy
post 12.04.2004, 22:27:04
Post #46





Grupa: Zarejestrowani
Postów: 204
Pomógł: 0
Dołączył: 26.12.2003
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


U mnie jak na razie (a pewnie zmieni się 100 razy) wygląda to tak:

Użycie:
[php:1:650229d311]<?php

@require 'Main.php';

Main::set('Controller', new Controller);


?>[/php:1:650229d311]

Klasa Main:

[php:1:650229d311]<?php


final class Main {


private static $references = array();


public static function set($className, $reference) {

self::$references[$className] = $reference;

}


public static function get($className) {

if(array_key_exists($className, self::$references)) {
return self::$references[$className];
}

}


public static function load($name, $notClass = false, $notReport = false) {

[ciach]

}

}


function __autoload($className) {

Main::load($className);

}


?>[/php:1:650229d311]

Klasa Controller:


[php:1:650229d311]<?php

final class Controller {


public function __construct() {

Main::load('functions/main', true);
Main::load('functions/page', true);
Main::set('Page', new Template('Main'));
Main::set('ErrorHandler', new ErrorHandler);
Main::set('Client', new Client);

$cfg = new Cfg('db');

Main::set('SQL',
new mysqli(
$cfg->get('host'),
$cfg->get('user'),
$cfg->getDecoded('pass'),
$cfg->get('db')
)
);

Main::set('SessionHandler', new SessionHandler);
Main::set('Rewrite', new Rewrite('sdd'));
Main::get('Rewrite')->set(0, 'home');
Main::get('Rewrite')->set(1, 0);
Main::get('Rewrite')->set(2, 0);

}


}

?>[/php:1:650229d311]

Główna różnica w porównianiu z Twoją (Balin) klasą polega na tym, że obiekty można konstruować z parametrami (czasem się przydaje).

Nie tak dawno używałem czegoś podobnego do Twojego, jednak uznałem, że obecne rozwiązanie ma więcej zalet.
Można na przykład przechowywać dowolną ilość instancji tej samej klasy pod innymi nazwami.
Napisz co o tym myślisz.
Go to the top of the page
+Quote Post
Balin
post 13.04.2004, 00:20:10
Post #47





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 14.05.2003

Ostrzeżenie: (0%)
-----


Rozwiazanie ciekawe, ale wg mnie troche niebezpieczne - kozystajac z metody, ktora zastosowales tracisz kontrole nad tym ile egzemplarzy obiektow zostalo utworzonych, ja wykorzystuje jadro tylko do tworzenia singletonow, wiec nie potrzebuje mozlwosci tworzenia kilku egzemplarzy jednej klasy, planuje zaimplamentowac u siebie mechanizm, ktory bedzie sprawdzal skad nastapilo rzadanie przekazania referencji do obiektu i na tej podstawie ocenial czy dany modul ma uprawnienia aby otrzymac taka referencje.
Chce sie jednak wczesniej dowiedziec czy takie rozwiazanie ma sens w duzym, elastycznym projekcie nastawionym na rozwoj ?
Go to the top of the page
+Quote Post
Ozzy
post 13.04.2004, 08:54:03
Post #48





Grupa: Zarejestrowani
Postów: 204
Pomógł: 0
Dołączył: 26.12.2003
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


Cytat
wg mnie troche niebezpieczne


Tak jak mówie, zmieni się jeszcze 100 razy, bo na razie tak jak Ty szukam jakiegoś rozsądnego rozwiązania.

Update: Korzystając z okazji, ile wykonuje Ci się ten kod? (z wszystkimi klasami) i do czego służy klasa IO?
Go to the top of the page
+Quote Post
hawk
post 13.04.2004, 10:01:45
Post #49





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


Cytat
Czy dobrym pomyslem jest wg. was stworzenie klasy jadra, ktora tworzy instancje wszystkich obiektow (singletonow), bibliotek i sprawdza ew. skad zostalo przyslane rzadanie o instancje danego obiektu ?

Po pierwsze, instancji singletona nie da się stworzyć z zewnątrz. Singleton sam tworzy sobie instancję kiedy jest mu potrzebna. Na tym właśnie polega singleton i twój kod - mówiąc wprost - nie ma z nim nic wspólnego.

Po drugie, jak chcesz sprawdzić, "skąd przyszło żądanie"?(btw: żądanie, nie rządanie smile.gif ) Takie coś potrafi natywnie zrobić tylko error handler, ew. debug_backtrace(), ale nie sądzę, aby o to chodziło.

Po trzecie, samo w sobie takie sprawdzanie jest złe. Bo wprowadzasz dodatkową warstwę - jakieś ograniczenia i zasady, których nie widać na diagramie klas i w ogóle nie wiadomo do czego przynależą. Wzrost chaosu. A to (brak kontroli) wcale nie jest wielkim zagrożeniem. Bo w dobrym systemie i tak nie można nic zepsuć - masz metodę getX(), ale nie masz setX() i nie zepsujesz obiektu. A poza tym takie zepsucie jest działaniem świadomym. Jeżeli założymy, że programista nie chce sam rozwalić sobie kodu, to nie jest to potrzebne. Wiesz, że dany moduł nie potrzebuje bazy danych - nie używasz, bo po co?

Po czwarte, po co ci obiekt którego jedynym zadaniem jest tworzenie innych obiektów? Jeżeli nie wnosi nic dodatkowego, to singletony załatwiają sprawę i są prostsze. Chyba że wnosi on dodatkową "inteligencję".

Po piąte, bardzo się cieszę że widzę wreszcie kod w PHP5, a nie tylko ciągle stary paskudny PHP4 biggrin.gif .
Go to the top of the page
+Quote Post
e-Gandalf
post 13.04.2004, 18:49:51
Post #50





Grupa: Przyjaciele php.pl
Postów: 195
Pomógł: 0
Dołączył: 7.07.2003
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Ja sie ostatnio sklaniam ku pelnej modularyzacji z trzema centralnymi interfejsami.
1) Input
2) Output
3) Processing

I tak, modul jadra po uruchomieniu na podstawie danych srodowiskowych (ustawienia systemu+argumenty) decyduje o zwracanym pakiecie danych (szablony danych w xml) i zwracanym formacie danych (html,xhtml,wap, sidebar, rss). Nastepnie sprawdza czy posiada "swierzy" cache z takim outputem, jesli tak, uzywa go, jesli nie wybiera format danych wejsciowych (input - baza danych, rdf, xml, remote xml), uruchamia klase dziedziacza interfejs Processing odpowiedzialna za dany szablon, ktora zwraca xml, ktory po sprawdzeniu na zgodnosc z DTD parsowany jest klasa dzidziczaca po interfejsie Output (np XHTMLOutput albo WAPOutput) korzystajaca z transformantow xsl. Wynik jest cachowany i wypluwany.

Generalnie przy budowie mocno wzorowalem sie na Gecko przy takich sprawach jak podzial na Serwisy i Interfejsy (serwis to klasa nie posiadajaca instancji - jak np. output), i staralem sie wprowadzic maksymalna ilosc kontroli przy uzyciu specjalizowanych XMLi w transporcie danych miedzy modulami. Mam swiadomosc narzutow czasowych, ale rekompensowane jest to przez cache.

Mam nadzieje, ze choc troche zrozumiale to brzmi smile.gif To moja pierwsza proba z xml->xslt jako generatorem wyjscia, ale dziala to to ladnie i nawet szybko smile.gif
Go to the top of the page
+Quote Post
hawk
post 14.04.2004, 11:42:32
Post #51





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


@e-Gandalf:
To naprawdę ciekawe podejście. Zastanawiam sie, jak rozwiązałeś kwestię cache (co to znaczy świeże, jak rozwiązać problem dynamicznych danych, itd.). Bo XSLT ma wielkie możliwości, ale jednak nie nadaje się do stosowania przy każdym żądaniu.

BTW, przychodzi mi na myśl zaraz Cocoon... może znasz? Dla php był chyba jakiś klon, o dźwięcznej nazwie Popoon biggrin.gif .
Go to the top of the page
+Quote Post
lolek09
post 14.04.2004, 16:30:46
Post #52





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 30.05.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Hmm... może trafię jak kulą w płot, ale jak mniej więcej działa klasa IO (czyli chyba Input/Output). Rozumiem, że przechowuje dane input a więc _POST _GET _COOKIES itp. Ale nie rozumiem po co. Przecież to są tablice superglobalne. Wszędzie można je czytać. Po prostu to jest to co mi pierwsze przyszło na myśl - ale skoro taką klasę stosukecie, znaczy jest potrzebna. Czy moglibyście mnie oświecić?


--------------------
Chciałbyś zobaczyć program bez błędów? Wyobraź sobie UFO, w którym Elvis doi swojego jednorożca
Go to the top of the page
+Quote Post
e-Gandalf
post 14.04.2004, 16:51:13
Post #53





Grupa: Przyjaciele php.pl
Postów: 195
Pomógł: 0
Dołączył: 7.07.2003
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat
Zastanawiam sie, jak rozwiązałeś kwestię cache (co to znaczy świeże, jak rozwiązać problem dynamicznych danych, itd.).


Tak jak onet smile.gif Output idzie do pliku o losowej nazwie, a do bazy wpis z indeksem pliku, informacja o szablonie, formacie i zestawie danych dla jakich plik cache zostal stworzony i data. Jesli jakas klasa modyfikuje dane (np. dodawny jest news) odpowienie szablony sa dodawne do kolejki generacji cache.

Cytat
BTW, przychodzi mi na myśl zaraz Cocoon... może znasz? Dla php był chyba jakiś klon, o dźwięcznej nazwie Popoon .


Nie wiem smile.gif Ja bardzo nie lubie gotowcow php bo jestem nimi nieodmiennie zawiedziony. Biblioteka Pear moim zdaniem zasluguje na miano najgorszej oficjalnej biblioteki jezykowej na swiecie.


Lolek9: To co napisales (GET|POST) to argumenty okreslajace zapytanie. Czyli przekladajac na model ludzki one okreslaja (wraz z np. parametrami konfiguracyjnymi serwisu) co ma serwis wypluc i jak ma to wygladac. Input to zestaw danych z jakich korzystamy (pliki xml, baza danych itp) a output to to co jest wypluwane, u mnie jest to xml/xslt
Go to the top of the page
+Quote Post
lolek09
post 14.04.2004, 16:57:38
Post #54





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 30.05.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Dzięki, ach... czuje na swej skurze łagodny blasko oświecenia winksmiley.jpg
Czyli po prostu źle zrozumiałem rolę klasy Input i Output.
Dzięki
A, i jeszcze jedno pytanko... czy klasa Input np. powinna na przykład czytać z różnych plików?
Sprecyzuje może moje pytanko. Mam klasę User i mam nadzieję mieć klasę Input winksmiley.jpg
No i teraz plik w którym trzymam dane userów mam jako atrybut w input, a chce, aby z poziomu klasy User możnabyło dostać się do zawartości pliku. Czy to klasa User powinna czytać plik, czy może powinna po prostu wywołać metodę obiektu Input która przeczyta i zwróci zawartość??


--------------------
Chciałbyś zobaczyć program bez błędów? Wyobraź sobie UFO, w którym Elvis doi swojego jednorożca
Go to the top of the page
+Quote Post
e-Gandalf
post 14.04.2004, 19:00:24
Post #55





Grupa: Przyjaciele php.pl
Postów: 195
Pomógł: 0
Dołączył: 7.07.2003
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


No, to juz jest bardzo dyskusyjne smile.gif Sadze, ze kazdy uczestnik tej grupy bedzie mial wlasne zdanie. Ja sklaniam sie ku rozwiazaniu abstrakcyjnego API. tworzysz klase abstrakcyjna, lub (w php5) interfejs z metodami publicznymi getRow(num), getNextRow(), setPointer(num), getRows() i tak dalej a potem tworzysz wyspecjalizowane klasy dziedziczace ten interfejs, ktore te metody stosuja dla pliku xml o konkretnej budowie, albo dla bazy danych, albo dla pliku tekstowego, albo dla pliku RDF... Klasa User powinna pobierac z silnika referencje do aktywnej instancji klasy korzystajacej z interfejsu Input i uzywajac jej pobierac. Staraj sie mocno rozgraniczac to co zajmuje sie przetwarzaniem danych wewnatrz, a to co pobiera te dane z zewnatrz. Dzieki temu chcac zmienic metode przechowywania danych masz pewnosc, ze musisz jedynie podmienic klase implementujaca Input na inna.
Go to the top of the page
+Quote Post
marcin96
post 14.04.2004, 19:13:40
Post #56





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 21.08.2003
Skąd: Będzin

Ostrzeżenie: (0%)
-----


e-Gandalf.. a Ty czasem nie mówisz o DAO? Input to są jak dla mnie właśnie te dane przechwytywane od usera - czyli np: dane COOKIE, czy zmienne przesyłane np: POST'em... A to, o czym mówisz, to korzystanie z abstrakcji na źródło danych... (a nie dane wprowadzane z zewnątrz) czyli DAO. Czy może mylę pojęcia gdzieś? snitch.gif)


--------------------
www.calek.info
Go to the top of the page
+Quote Post
e-Gandalf
post 14.04.2004, 19:26:52
Post #57





Grupa: Przyjaciele php.pl
Postów: 195
Pomógł: 0
Dołączył: 7.07.2003
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Hmm... no sluchajcie, wszystko zalezy od sposobu patrzenia smile.gif
Dla mnie aplikacja wyglada tak:

Input <-- Processing+Engine--> Output

Gdzie Processing+Engine ma za zadanie pobrac dane wejsciowe i wypluc wyjsciowe. Gdzies tam przy okazji moze zrobic cos jeszcze (jak np. cache, z ktorego nastepnym razem skorzysta), a sposob dzialania ma uzalezniony od argumentow na rzecz ktorych jest wywolywany, ale Wejsciem dla mnie sa dane (nota bene) wejsciowe, a nie argumenty.
Ale nie bede sie upieral przy nazewnictwie, moze byc Ble i Bla, byleby dzialalo dobrze i pozwalalo na wygodna konserwacje oraz latwe dobieranie zrodel wejsciowych i wyjsciowych dla danych smile.gif
Go to the top of the page
+Quote Post
hawk
post 14.04.2004, 21:52:13
Post #58





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


@e-Gandalf:
Hmm, a jak to się ma do iteratorów w PHP5? Bo różni ludzie wymyślali różne DAO, własne iteratory i abstrakcję. A potem przyszło PHP5 i to wszystko jest lekko nieaktualne, bo PHP5 ma własne iteratory, i to lepsze.

Czy metody getRow(), getNextRow(), itd, nie robią czegoś w rodzaju iteratora? No może więcej niż iterator bo z dostępem swobodnym, ale IMHO robienie samemu czegokolwiek co służy do iteracji przestaje mieć sens. Zresztą zauważ że taki ogólny interfejs nie powinien mieć getRow(num), bo np. zapytanie SQL nie ma dostępu swobodnego - robisz query i dostajesz kolejne wiersze. Taki Input musiałby cacheować całość wyniku, a to nie jest optymalne. Więc lepiej pozostać przy dostępie sekwencyjnym.

A może POST i zapytanie do bazy są na tyle różne, że nie da się ich wcisnąć w ten sam interfejs? Może lepiej zrobić Input (tylko sekwencyjny) i CachedInput (extends Input + swobodny)? Hmm, jeszcze trochę i sam się zakręcę...
Go to the top of the page
+Quote Post
e-Gandalf
post 14.04.2004, 22:27:43
Post #59





Grupa: Przyjaciele php.pl
Postów: 195
Pomógł: 0
Dołączył: 7.07.2003
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat
@e-Gandalf:
Hmm, a jak to się ma do iteratorów w PHP5? Bo różni ludzie wymyślali różne DAO, własne iteratory i abstrakcję. A potem przyszło PHP5 i to wszystko jest lekko nieaktualne, bo PHP5 ma własne iteratory, i to lepsze.


Ale iterator daje Ci tylko wygodna metoda przechowywania listy danych, a ja mowie o komunikacji ze strefa zewnetrzna. Nie zbierzesz do iteratora wierszy z bazy danych, bo tych wierszy moze byc tam 10 milionow. Lepiej sprecyzowac ile pobierac smile.gif

Cytat
Czy metody getRow(), getNextRow(), itd, nie robią czegoś w rodzaju iteratora? No może więcej niż iterator bo z dostępem swobodnym, ale IMHO robienie samemu czegokolwiek co służy do iteracji przestaje mieć sens.


Pewnie. Dlatego Iterator czy Enumerator oficjalny z php5 mozna uzywac do zwracania wynikow tych funkcji.

Cytat
Zresztą zauważ że taki ogólny interfejs nie powinien mieć getRow(num), bo np. zapytanie SQL nie ma dostępu swobodnego - robisz query i dostajesz kolejne wiersze.


Podalem tylko przyklad, ale przedstawie Ci przyklad wdrozenia:

$x = $engine->services->getDefaultInput()::createStream();
$x->setInitPoint('localhost'.'baza','user','haslo','tablica');
/* i czesc uniwersalna */
$x->getRow(4);


i jesli getDefaultInput() jest wskaznikiem na MysqlInput to polaczy sie z baza danych i ustawi sobie query na tablice "tablica". Nastepnie getRow(4) wywoluje zapytanie 'select * from tablica limit 4,1'

To oczywiscie tylko przyklad, pewnie nalezaloby to wykonac troche inaczej, ale da sie smile.gif A na dodatek, potem, transparentnie dla API mozesz cachowac to query i np. trzymac w bazy wyniki, aby drugie zapytanie o getRow(4) zwracalo zawsze z cache, chyba, ze $x wykonywal metody set/update (czyli istnieje ryzko, ze dane byly modyfikowane).

Cytat
Taki Input musiałby cacheować całość wyniku, a to nie jest optymalne. Więc lepiej pozostać przy dostępie sekwencyjnym.


Nie koniecznie winksmiley.jpg Moglby, ale nie musialby. Wszystko zalezy jak zbudujesz klase, i do czego bedzie uzywana.

Cytat
A może POST i zapytanie do bazy są na tyle różne, że nie da się ich wcisnąć w ten sam interfejs?


No, interfejsu do Posta jeszcze nie robilem, ale wydaje mi sie, ze da sie. A jak ktos sie uprze to moze zrobic interfejsy dziedziczne ObjectInput i ListInput gdzie dziedziczyc po ListInput beda klasy odpowiedzialne za baze danych, rdf, tablice, skrzynke pocztowa i inne formy wielokrotnie powtarzajacych sie danych, a ObjectInput bedzie przyjmowal obiekt HttpResponseInput z wlasciwosciami argumentow _POST|_GET, XmlInput, TextFileInput itp.

Cytat
Może lepiej zrobić Input (tylko sekwencyjny) i CachedInput (extends Input + swobodny)? Hmm, jeszcze trochę i sam się zakręcę...


Mozliwosci sa ogromne, a w tej kwestii w php standardu jeszcze nie ma zadnego.
Go to the top of the page
+Quote Post
hawk
post 15.04.2004, 22:02:14
Post #60





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


Uff, sporo tego smile.gif
Cytat
Stąd min. korzystam z hashMapu (napisanego przeze mnie) oraz wielu elementów javovych.

Tutaj jestem bardzo przeciwny. Wiem że jest taka tendencja (eclipse, phrame), ale to bez sensu. php już ma HashMapy - tablice asocjacyjne. I klasa HashMapy nic nowego ci nie zaoferuje. Podobnie wiedziałem w php klasy ArrayList (to już szczyt głupoty), Iterator (w PHP5 równie wielka głupota) itd. To tylko balast, bezużyteczny kod i dodatkowe ułamki sekund przy każdym żądaniu.
Cytat
Otoz chodzi mi o to czy przykladowo sesje operujace na bazie danych mozna zaliczyc do modelu ? Przykladowo rozpoczynajac sesje wywolywal bym session::create(); referencje do tablicy SESSION poprzez session::get itd.

No cóż, sesje, dane post, itd. generalnie nie pasują do MVC. Z jednej strony to jest źródło danych -> Model. Z drugiej strony tylko Kontroler powinien wiedzieć że jest żądanie HTTP -> Kontroler. IMHO nie ma sensu wpychać tego nigdzie na siłę. Sesje to jest coś jak Model, ale odrębne, bo Model się pisze pod konkretną aplikację, a obsługa sesji jest częścią jądra systemu/frameworku.

A swoją drogą, ja skłaniam się do włożenia sesji do kontekstu. To chyba pomysł z ASP.NET - klasa Context, która łączy Request i Response, czyli zbiera do kupy wszystko, co związane jest z komunikacją klient - serwer.

Cytat
I kolejna sprawa jest dostep do konkretnej akcji. Wywolanie jej wyglada u mnie mniejwiecej tak:

router (parsowanie urla) -> httpServletRequest -> ActionController(mappings) -> nastepnie calosc roznych dziwnych operacji winksmiley.jpg z ladowaniem bibliotek i sprawdzaniem zaleznosci... I teraz gdzie ja tu mam wtrynic kontrole dostepu... Skoro korzysta ona z db to chyba trzeba to zaliczyc do modelu ? Czy ma byc to czesc actionControllera. Poradzcie sad.gif

Miło widzieć że ktoś też lubi router smile.gif . Widzicie to, zespół core? Coś w tym jest.
Ja bym jednak umieścił router ZA kontrolerem. Tak będzie działał (działa) phiend2, i ma to wielką zaletę: router można sobie łatwo wymienić, bo to zawarte jest w konfiguracji kontrolera. I kiedy nagle przyjdzie ci do głowy że index.php?action=foobar jest głupie, i chcesz mieć index.php/foobar, to tylko wybierasz odpowiedni router.

A co do kontroli dostępu, czyli auth... Owszem, auth można włożyć do Modelu. Tylko wtedy najpierw jest tworzona akcja, a potem akcja wywołuje metody auth. Bo przecież z Modelu korzystają akcje. A to nie jest dobre, bo można po prostu zapomnieć w jednej akcji sprawdzić prawa dostępu i już mamy security breach. Takie rzeczy jak auth powinny odbywać się PRZED akcją, żeby była pewność że zawsze się wykonają. Niewykonany auth to gorzej niż niewykonana akcja.

Wracając do pytania - gdzie to wcisnąć? Odpowiedź jest prosta i znowu żywcem wzięta z phiend2 - Intercepting Filter. Piękny wzorzec, wrzucasz do kontrolera obsługę filtrów (wczytywanie z pliku konfiguracyjnego i odpalanie). O samym wzorcu poszukaj na MSDN (narawdę mają bardzo dobry dział dot. wzorców dla aplikacji internetowych) i Sunie - zresztą w J2EE Intercepting Filter jest wbudowany.
Go to the top of the page
+Quote Post

7 Stron V  < 1 2 3 4 5 > » 
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.03.2024 - 05:07