Mam aplikację, która jest zasadniczo opakowaniem dla interfejsu API innej firmy. Aplikacja nie używa bazy danych i przechowuje tylko jeden plik cookie, który jest identyfikatorem sesji wymaganym przez interfejs API.PHP OOP :: Budowanie klasy wrapper API
API jest to system, który pozwala użytkownikom na zakupy do
-login/Rejestracja/edytuj profil/wylogowania
-buy towar
-make darowizny
-become członkiem
Interfejs API ma około 50 metod, z którymi moja aplikacja musi się połączyć. Przykładowe wywołania API to addItemToBasket(), addDonation(), GetUserDetails() itd.
Próbuję ustalić, co powinno być zajęciami w mojej aplikacji. Oto co mam do tej pory:
Klasy
1) APIManager() klasy zawiera metody, które pasują jeden do jednego z metodami narażonych na 3rd API i zapewnia mechanizm nawiązywania połączenia ze zdalnym serwerem API. Tak więc użytkownik będzie zalogowany poprzez
APIManager->loginUser($sessionKey, $uid, $pwd);
a pilot API by ustawić użytkownika jako zalogowany razie potrzeby być, moja aplikacja może sprawdzić zalogowany stanu dowolnego klucza sesji przez wywołanie funkcji API.
APIManager->isLoggedIn($sessionKey);
2) użytkownika() Klasa Dotyczy to metody, które zawierają logikę biznesową wymaganą przed rozpoczęciem przetwarzania wywołań API, takich jak lub zarejestruj. Metoda przykładem jest:
function login($_POST) {
//perform sanity checks, apply business rules etc.
//if certain conditions are met, we may pass in a promo code, $pc
APIManager->loginUser($sessionkey, $_POST['uid'], $_POST['pwd'], $pc);
}
Zdaję sobie sprawę, że mogę chyba tylko zatelefonować do APIManager ze strony logowania, zamiast klasę użytkownika per se, ale czułem, że ponieważ niektóre logiki biznesowej musi uruchomić przed tak naprawdę nazywamy metodę loginUser() API, to było właściwe, aby było obsługiwane w klasie użytkownika. Chciałbym wiedzieć, co ludzie o tym myślą.
3) Basket() klasy
Kosz jest zarządzany w API 3rd party, więc moja aplikacja rola jest, aby odpowiednie wywołań API do dodawania nowych elementów do kosza, usunąć elementy, wyświetlić koszyk itp. Moja aplikacja nic nie wie o koszyku, dopóki dane nie zostaną pobrane z interfejsu API, ani nie może wprowadzać żadnych zmian w koszyku bez przechodzenia przez interfejs API. Ponownie, należałoby pogrupować tę powiązaną logikę w klasę koszyka. Koniec strona przednia może wywołać coś takiego:
Basket->addItem(23);
i tym sposobem addItem() w klasie Basket będzie wyglądał:
addItem($itemID) {
//perform checks, apply business rules e.g. if user is eligible for discount
APIManager->addToCart($itemID, $discount);
}
gdzie addToCart() to trzecia metoda partia API my zadzwoń, aby przetworzyć przedmiot.
4) Darowizna() klasy
To pozwala użytkownikom na dokonanie wpłaty. Darowizna pojawia się w koszyku i może zostać usunięta z koszyka. Myślałem, że po prostu dodanie metody addDonate() do klasy kosza i nie martwić się o obiekt Darowizna w ogóle, ale ... (patrz niżej)
5) członków() Klasa
. .. członkostwa są w rzeczywistości typem darowizny! API będzie traktować darowiznę na określone konto jako roczne członkostwo, a nie zwykłą darowiznę. Nie możemy zmienić logiki/zachowania API strony trzeciej.
Więc, jeśli oddam 50 dolarów na konto "1", to zwykła darowizna, ale jeśli przekażę 100 dolarów na konto "8", zostanę członkiem z wszystkimi korzyściami dla członków (obniżone ceny, brak opłaty pocztowej itp.).
Oto, gdzie nie jestem pewien najlepszego sposobu zaprojektowania tego.
Czy powinienem utworzyć klasę darowizny, a następnie rozszerzyć ją o Członkostwo, ponieważ wszystkie metody darowizn będą wymagane przez Członkostwo. Ale członkostwo będzie wymagać dodatkowych metod, takich jak odnowienie() lub getExpiry() itp.
Ponadto, czy powinienem patrzeć na rozszerzenie użytkownika, aby stać się członkiem? Znowu członek ma wszystkie podstawowe metody, które posiada użytkownik, ale ma też dodatkowe, takie jak getSpecialOffers() lub getDiscountCode(), do których dostęp mieliby tylko członkowie.
Wszelkie wskazówki dotyczące najlepszego podejścia do projektu będą bardzo mile widziane.
Dzięki, James
nie odpowiedź, której szukasz, ale co mi pomaga przy projektowaniu coś w zorientowane obiektowo projektu jest zwrócenie się schemat obiektów, wypracowanie, gdzie jest wspólność itd. Jeśli zrobisz to przed zanurkowaniem i kodowaniem, okaże się, że masz o wiele łatwiejszy czas. A skończysz z czymś dłuższym maintabke na dłuższą metę. – diagonalbatman