Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dylemat dotyczący wydajności kodu klasy
Forum PHP.pl > Forum > PHP
sebap123
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?
luck
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.
sebap123
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ę.
bastard13
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ć.
enviro
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ć.
bastard13
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.
enviro
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.

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.