Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Dylemat dotyczący wydajności kodu klasy, nie wiem jaki typ metody będzie wydajniejszy
sebap123
post 6.09.2011, 19:56:48
Post #1





Grupa: Zarejestrowani
Postów: 253
Pomógł: 1
Dołączył: 26.08.2009
Skąd: Szczecin

Ostrzeżenie: (10%)
X----


Witam,

Pisze właśnie klasę obsługującą konta użytkowników w serwisie. Generalnie każdy użytkownik jest wpisywany do trzech różnych tabel - jedna to ogólnie login, mail itp; druga to dane adresowe; a trzecia dane dotyczące blokad, pochwal itp.
Teraz się zastanawiam, jak będzie lepiej napisać metody edytujące różne dane z tych tabel. Czy lepiej jest napisać parę "wyspecjalizowanych" metod, gdzie każda odpowiada za góra dwie-trzy komórki z jednej tabeli, czy np. jedną duża i ogólna metodę odpowiadającą za wszystko. Zaznaczam też, że nie wszystkie pola będą edytowane tak samo często jak pozostałe.

Macie jakieś porady, czy to nie ma większego znaczenia?
Go to the top of the page
+Quote Post
luck
post 6.09.2011, 20:06:08
Post #2





Grupa: Zarejestrowani
Postów: 317
Pomógł: 58
Dołączył: 6.11.2005

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


Znasz powiedzenie "premature optimization is the root of all evil"? Będąc na Twoim miejscu nie przejmowałbym się tym zupełnie, tylko pisał tak, jak mi wygodnie. Rozumiem, że chcesz wykonać to jak najlepiej, ale o ile nie przewidujesz, że będziesz miał kilka miliardów użytkowników w tabeli, to moim zdaniem szkoda czasu na zastanawianie się nad tym już teraz.


--------------------
Go to the top of the page
+Quote Post
sebap123
post 6.09.2011, 20:08:04
Post #3





Grupa: Zarejestrowani
Postów: 253
Pomógł: 1
Dołączył: 26.08.2009
Skąd: Szczecin

Ostrzeżenie: (10%)
X----


No raczej tylu użytkowników się nie spodziewam tongue.gif Może i racja, żeby "iść za głosem serca". Dzięki za radę.
Go to the top of the page
+Quote Post
bastard13
post 6.09.2011, 20:11:35
Post #4





Grupa: Zarejestrowani
Postów: 664
Pomógł: 169
Dołączył: 8.01.2010
Skąd: Kraków

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


Powinieneś mieć takie metody, jakich będziesz używał np. przy edycji danych zawsze dostajesz wszystkie (nawet jeżeli się nie zmieniły), więc nie ma sensu pisać dla każdej kolumny settera, bo zawsze masz komplet danych. Ewentualnie, już wewnątrz klasy, możesz wyłapywać dane, które się w rzeczywistości zmieniły i tylko te zapisywać.


--------------------
Go to the top of the page
+Quote Post
enviro
post 7.09.2011, 07:37:48
Post #5





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 6.09.2011
Skąd: Wrocław

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


Tak jak napisał mój poprzednik, pisz tylko takie metody w klasie, z których będziesz korzystał.

Jednak co do optymalizacji Twojego zagadnienia. Wszystko zależy od tego, czy masz napisaną własną klasę do wykonywania zapytań, czy korzystasz z wbudowanych klas PHP.

Moja rada jest taka. Zbuduj własną klasę PHP i ustaw dziedziczenie z wykorzystywanej przez Ciebie klasy bazodanowej (np: MySQLi).
W klasie zbuduj metodę o nazwie "Update", która przyjmować będzie tablicę asocjacyjną zbudowaną na przykład tak:
  1. 'table' => 'users',
  2. 'data' => array(
  3. 'name' => 'tomek',
  4. 'id' => 34
  5. )
  6. );


I teraz w tej metodzie na podstawie danych z tablicy aktualizujesz tabelę `users` a w niej pole `name` na Tomek o `id` = 34. I nie potrzebujesz już pisać wyspecjalizowanych metod aktualizujących poszczególne elementy lub jednej wielkiej aktualizującej wszystkie elementy.

Zagadnienie kontroli danych. Tutaj poleciłbym stworzenie znowu odpowiedniej klasy i metod, które przyjmować będą w swoich parametrach dane o wartości jaką mają sprawdzić i pod jakim kątem ją sprawdzić.


--------------------
Jeżeli debugowanie to proces usuwania błędów, to programowanie musi być procesem ich tworzenia.
Go to the top of the page
+Quote Post
bastard13
post 7.09.2011, 10:42:21
Post #6





Grupa: Zarejestrowani
Postów: 664
Pomógł: 169
Dołączył: 8.01.2010
Skąd: Kraków

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


Co do wydajności, to zawsze najszybciej będzie nie opakowywać tego, tylko używać php'owych funkcji.
Na szczęście w dzisiejszej dobie możesz pominąć kwestię wydajności (no chyba, że jest to jakiś rzeczywisty wymóg), ponieważ istotniejsza jest (szczególnie przy większych projektach) czytelność kodu, a z tego powodu warto skupić się na pisaniu obiektowym.
Osobiście polecałbym ci jakiegoś ORM'a do obsługi tego wszystkiego, bo łatwiejsza do zrozumienia jest logika projektu. Opakowanie zapytania update w sposób, który zaproponował enviro wydaje mi się złym podejściem. User powinien być osobnym bytem i powinno to w kodzie wyglądać mniej więcej tak:
  1. $user->setData($data)->save();

I już. Od razu widać co się dzieje - właśnie zostały zapisane dane użytkownika. Natomiast coś takiego:
  1. MyMysqli::update(array(
  2. 'table' => 'users',
  3. 'data' => array(
  4. 'id' => 34,
  5. 'name; => 'name'
  6. )
  7. ))

Chyba nie wygląda zbyt elegancko i zmusza do zbytecznego wysiłku, aby zrozumieć co się tu dzieje:)
Oczywiście gdzieś tam w końcu musisz wykonać ten update, ale albo zastosuj do tego ORM'y, bo już tam wszystko jest ładnie opakowane i raczej lepiej (przynajmniej szybko:) tego nie napiszesz, a jeżeli nie to wykonuj normalne query, bo to będzie szybsze.


--------------------
Go to the top of the page
+Quote Post
enviro
post 7.09.2011, 11:01:18
Post #7





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 6.09.2011
Skąd: Wrocław

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


Chyba do końca mnie nie zrozumiałeś "bastard13".

Po pierwsze, pisząc własną klasę (jak to ją nazwałeś MyMySQLi) masz gotowe narzędzie do wykonywania i obsługi zapytań na bazie funkcji php'owych. (W końcu coś musi sprawdzić czy połączyłeś się z bazą, wykonałeś zapytanie poprawnie etc). I lepiej to zrobić raz w klasie niż kilkaset razy w różnych plikach. To jest podejście OOP. I utrzymanie takiej klasy jest łatwiejsze, a obudowujesz taką klasę tym, co uważasz za niezbędne i wykorzystasz w projekcie.

Napisaną bibliotekę MyMySQLi należy wykorzystać w klasie Users, a nie samych plikach (kontrolerach). Wtedy wywołanie metody $user->saveData($data)->save() wywoła wewnątrz tej metody naszą metodę MyMySQLi::update($data). I wtedy jest to bardzo czytelne i umożliwia dodawanie/edycję w przyszłości metod obu klas, bez konieczności zmiany ich wywołania lub parametrów.

Poza tym komentarze i dokumentacja to niezbędny w takich projektach czynnik do zrozumienia kodu. Raz napisany dobrze komentarz w klasie MyMySQLi i metodzie update() zawsze Ci wyjaśni, o co tak na prawdę chodzi.



--------------------
Jeżeli debugowanie to proces usuwania błędów, to programowanie musi być procesem ich tworzenia.
Go to the top of the page
+Quote Post

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: 7.07.2025 - 23:49