![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 253 Pomógł: 1 Dołączył: 26.08.2009 Skąd: Szczecin Ostrzeżenie: (10%) ![]() ![]() |
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? |
|
|
![]()
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.
-------------------- |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 253 Pomógł: 1 Dołączył: 26.08.2009 Skąd: Szczecin Ostrzeżenie: (10%) ![]() ![]() |
No raczej tylu użytkowników się nie spodziewam
![]() |
|
|
![]()
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ć.
-------------------- |
|
|
![]()
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:
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.
|
|
|
![]()
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:
I już. Od razu widać co się dzieje - właśnie zostały zapisane dane użytkownika. Natomiast coś takiego:
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. -------------------- |
|
|
![]()
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.
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 7.07.2025 - 23:49 |