• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Najbardziej zaawansowany program/klasa/funkcja jaką napisaliście?

VPS Starter Arubacloud
0 głosów
226 wizyt
pytanie zadane 11 lutego 2017 w Algorytmy przez Willbe Nowicjusz (120 p.)

Cześć Wszystkim :)

Pytanie jak w temacie - pochwalcie się swoim najbardziej skomplikowanym dziełem niezależnie od tego czy to coś prostego czy już trudniejsze łamigłówki ;> Oczywiście nie musicie wklejać kodu, to wasza własność intelektualna :) 

A poniżej opis mojego problemu w PHP i skromnego opisu jego rozwiązania ; > 

Jakiś czas temu zacząłem pisać system do zarządzania zamówieniami w firmie. Chciałem napisać na prawdę solidny kod, nauczyć się przy okazji czegoś. Na początku napisałem routing ( dla początkujących jest to funkcja klasa, która parsuje adres URI, lub GET/POST i w zależności od zapytania wywołuje odpowiednią klasę / funkcje ). Szybko okazało się, że jeśli chce wywołać klasę, która do swojego działania potrzebuję obiektu innej klasy, czy wielu klas to jest problem. Przykład kodu:

class pierwsza {}

class druga {
   private $pierwsza;

   public function __construct(pierwsza $pierwsza) {}
}

class trzecia {
   private $druga;

   public function __construct(druga $druga) {}
}

class classLoader {
   public function loadClassWithDependencies($className) {
      // tutaj kod za zaladowanie wybraje klasy wraz z wszystkimi jej zaleznosciami
   }
}

$obj = classLoader('trzecia');

Jak widać w tym przykładzie chodzi o to, żeby metoda loadClassWithDependencies stworzyła obiekt klasy trzecia , i nie było by w tym problemu gdyby klasa trzecia nie wymagała klasy druga, która wymaga klasy pierwsza. Metoda loadClassWithDependencies ma za zadanie załadować dowolną wskazaną klasą niezależnie od ilości zależności i zależności tych zależności itd (...).

Na początku z pomocą przyszło ReflectionClass. Klasa ta umożliwia wyciągnięcie wielu informacji na temat wskazanej klasy bez konieczności jej uruchamiania. W ten sposób stworzyłem drzewo wszystkich klas powiązanych bezpośrednio, lub pośrednio z klasą docelową w tym przypadku jest to klasa trzecia. Oczywiście wymagało to użycia funkcji rekurencyjnej.

Następny krok zajął mi sporo czasu przez nieznajomość języka i try-hardowanie zamiast na chłodno spojrzeć na sprawę. Teraz mając już drzewo należy wywołać klasy w odpowiedniej kolejności z ich zależnościami. Problemem tu było to, że klasy mogą potrzebować różnej ilości zależności. Może być przypadek gdzie klasa potrzebuje 3,5,10,15 zależności. Pierwsze co pomyślałem to po prostu przekaże tablicę obiektów i się wywoła, no ale nic z tego. PHP wyrzuciło błąd - argument musi być obiektem, a nie tablicą ;)

Później przypadkiem trafiłem na funkcję eval i wpadłem na jeszcze jeden pomysł ; > Funkcja eval wykonuje kod, który jest podany jako argument typu string. Dzięki temu mogłem wygenerować potrzeby fragment kodu, coś w tym rodzaju:

$string = "new trzecia(";

foreach ($dependencies as $dependency) {
   $string = $string."$dependency,";
}

$string = $string.");";

eval($string);

Powyższa pętla dodaje do zmiennej $string wszystkie zależności dla klasy trzecia, natomiast funkcja eval wywołuje zawartość zmiennej $string jako kod PHP ; > W ten sposób jest utworzona klasa z wszystkimi potrzebnymi argumentami, czyli w tym przypadku obiektami ; >

Drugim sposobem jest podobnie jak powyżej utworzenie stringa z kodem. Następnie należy zapisać ten kod do pliku file_put_contents i załadować require/include ; >  Można nawet tworzyć cache, wszystkich możliwych wywołań i wtedy już wystarczy tylko ładować odpowiedni plik bez potrzeby generowania stringa z kodem ; >

Przyznam się, że to mój pierwszy tak długi post, w którym opisuje proces tworzenia czegoś więc miejcie jakieś minimum wyrozumiałości ; > A no i pierwszy post tutaj ! ; ) Jeśli macie jakieś pytania to śmiało ; >

Czekam na wasze algorytmy, z którymi się uporaliście, a może nadal z czymś walczycie niczym wojownik poeta? ;> Oczywiście nie musi nikt opisywać tego choć mile widziane jakieś wyjaśnienia, skrawki kodu ;>

Edit: nie jest to pełne rozwiązanie problemu, fragmenty kodu pisałem z palca i mają one za zadanie jedynie zarysować problem / jego wyjaśnienie / rozwiązanie. 

komentarz 11 lutego 2017 przez Boshi VIP (100,240 p.)
Nie, to na pewno nie jest solidny kod, to zaprzeczenie jakichkolwiek zasad pisania obiektowego.. eval? tego się nie powinno używać, niebezpieczna funkcja. Do tego budowanie obiektów po przez łączenie stringów? na myśl by mi nie przyszło..

Poczytaj o wzorcach, bo z tego co zrozumiałem to jest coś czego potrzebujesz..

z drugiej strony po kiego pisać swój routing skoro można skorzystać z komponentu symfony?
komentarz 11 lutego 2017 przez Willbe Nowicjusz (120 p.)
Zaprzeczenie zasad programowania obiektowego? Tzn jakich zasad?

Eval jest niebezpieczną funkcją tylko jeśli przyjmuje jako input dane od użytkownika, lub użytkownik ma jakąkolwiek możliwość manipulacji tym kodem ; > W mojej klasie nie ma takiej możliwości ponieważ to routing ;> A także napisałem, że istnieje druga możliwość za pomocą file_put_contents jeśli na hostingu jest zablokowany eval ; >

Tzn o jakich wzorcach? To jest routing, czy RESTFul jak wolisz ; > MVC mam zaimplementowane nieco dalej ; >

Po co pisać swój routing? bo chce i mogę i chce się rozwijać ; > Lubie też rozwiązywać problemy, tworzyć własne rozwiązania na własne potrzeby. I ostatnie czemu: bo moim wyjściowym założeniem było napisanie dedykowanego rozwiązania, a symfony jest opensource ; >
1
komentarz 11 lutego 2017 przez Boshi VIP (100,240 p.)
A pisz, ale ten kod nie nadaje się do niczego innego jak na śmietnik.  Powodzenia w używaniu tego.

1 odpowiedź

0 głosów
odpowiedź 11 lutego 2017 przez DarkEliat Bywalec (2,810 p.)
Ja ostatnio napisałem klasę odpowiedzialną za animację sprita w SFML 2.4. Mogę regulować prędkość animacji, dodawać klatki, usuwać je, zapętlać całą animację. Dodatkowo klasa jest przystosowana do korzystania z atlasów tekstur. Pozdrawiam ;)

Podobne pytania

0 głosów
3 odpowiedzi 559 wizyt
pytanie zadane 27 sierpnia 2016 w C i C++ przez KURKSON Nowicjusz (120 p.)
+1 głos
3 odpowiedzi 443 wizyt
pytanie zadane 26 stycznia 2023 w Rozwój zawodowy, nauka, praca przez urogi7 Początkujący (340 p.)

92,452 zapytań

141,261 odpowiedzi

319,074 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...