![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 78 Pomógł: 9 Dołączył: 2.02.2011 Skąd: undefined Ostrzeżenie: (0%) ![]() ![]() |
Witam
Zastanawiałem się podczas tworzenia projektu jak rozwiązać problem połączenia metod wywoływanych poprzez __call() z metodami wymaganymi przez interfejs. Otóż zdefiniowałem sobie taki interfejs (chcę ujednolicić swoją kolekcję klas z kategorii działań arytmetycznych;P):
Zakładam też że wszelkie działania (np. dodawanie) mogą być wykonywane tylko z obiektem należącym właśnie do tego interfejsu. Jak dobrze myślę gdy klasa będzie to implementowała, to będzie musiała zawierać definicję tych metod co prawdopodobnie(jeśli mam rację;P) nie pozwoli na przechwycenie ich przez __call(). Dodatkowo zależy mi na łatwym rozszerzaniu całości bez modyfikacji istniejącego kodu. Aby zobrazować mój problem wezmę np. metodę add() (dodawanie do siebie dwóch obiektów). Zamierzałem ją zaimplementować w ten sposób:
Jak wiadomo muszę odpowiednio sprecyzować to działanie dla dwóch różnych klas (inaczej doda rzeczywistą do rzeczywistej, zespoloną do zespolonej, rzeczywistą do zespolonej itd.) W związku z tym zamierzałem zrobić do tego w każdej klasie definicję dodawania (prywatną) dla różnych typów argumentu (np. _add_Numbers(), _add_Complex(), _add_Matrix() itp). Powoduje to, że metoda add() jak powyżej. Ale wtedy pojawia się problem powielania kodu, bo dla metody div() postąpię tak samo. Ale nie bez powodu utworzono metodę magiczną __call(), żeby powielać kawałki kodu. W związku z tym zastanawiam się, czy nie lepiej by było zdefiniować w interfejsie, nie niewiele znaczącej metody add() a zamiast za to kilka metod _add_{class_name}() które będą odpowiadały za operację pomiędzy różnymi typami klas, a metodę add() przechytywać magicznie i wywoływać właśnie metodę dedykowaną dla argumentów? Dałby radę ktoś podpowiedzieć, ocenić pomysł(IMG:style_emoticons/default/questionmark.gif) |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 83 Pomógł: 9 Dołączył: 21.05.2004 Skąd: Glogau/Breslau Ostrzeżenie: (0%) ![]() ![]() |
Abstrahując od sensowności całości, możesz sobie trochę uprościć bez użycia __call
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 78 Pomógł: 9 Dołączył: 2.02.2011 Skąd: undefined Ostrzeżenie: (0%) ![]() ![]() |
tzn co nie ma sensu bo nie za bardzo załapałem?
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat tzn co nie ma sensu bo nie za bardzo załapałem? 1. Grupowanie tych funkcji.2. Pomysł użcia __call() - dowalanie magiczności. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 435 Pomógł: 40 Dołączył: 16.02.2003 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
a czemu nie po prostu:
if nie będzie już potrzebny. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 78 Pomógł: 9 Dołączył: 2.02.2011 Skąd: undefined Ostrzeżenie: (0%) ![]() ![]() |
Czyli wszyscy mimo wszystko polecacie utrzymanie metody add()(IMG:style_emoticons/default/questionmark.gif) Bo nie wiem czy zrozumieliście mój problem.
Metody tj: add, sub, mul, div, pow wywoływane jako publiczne będą miały za zadanie tylko i wyłącznie wybrać metodę prywatną, dedykowaną dla argumentów. Oznacza to, że dla tych funkcji kod będzie podobny. michalJS przedstawił mi bardzo sensowny sposób który trochę skraca kopiowany kod. ano rzeczywiście tutaj mogę troszkę krócej:) Ten post edytował shinuexx 27.03.2012, 21:08:27 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Takie skracanie na siłę z reguły psuje kod, nie dając absolutnie nic w zamian.
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 78 Pomógł: 9 Dołączył: 2.02.2011 Skąd: undefined Ostrzeżenie: (0%) ![]() ![]() |
Oki. Więc w tym temacie dowiedziałem się tego co chciałem:)
Można zamknąć temat. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 17.09.2025 - 23:40 |