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

Zabawa w refaktoryzację - challange forumowy.

VPS Starter Arubacloud
+24 głosów
2,355 wizyt
pytanie zadane 4 października 2015 w Rozwój zawodowy, nauka, praca przez event15 Szeryf (93,790 p.)
przywrócone 13 października 2015 przez event15

Jakiś czas temu zapowiedziałem na czacie tą zabawę. 

O CO CHODZI?

Co jakiś czas będę wrzucał w tym temacie jakiś prosty algorytm, który będzie zazwyczaj sortować czy wyszukiwać. Będzie to jeden z tych podręcznikowych algorytmów, czyli skuteczny, szybki ale też okropny jeżeli chodzi o czytelność kodu.

CO TRZEBA ZROBIĆ?

Waszym (naszym) zadaniem będzie doprowadzenie tego kodu do ładu i składu - szeroko pojęta refaktoryzacja. W skład tej refaktoryzacji będzie wchodzić:

  • optymalizacja pamięci
  • optymalizacja nazw zmiennych
  • wyodrębnienie odpowiedzialności (czyli stworzenie funkcji, klas które będą pomagać zrozumieć kod)
  • zastosowanie wzorców projektowych i implementacyjnych
  • dla chętnych stworzenie testów
  • unikanie zbędnych komentarzy - dobry kod sam się tłumaczy ze swojego zachowania, najczęściej jeżeli kusi Cię, żeby zrobić jakiś komentarz, spróbuj najpierw przebudować metodę tak, aby nie trzeba było danego kawałka kodu komentować. 

CO TRZEBA WIEDZIEĆ?

Jeżeli jesteś w trakcie nauki i znasz język od kilku miesięcy - musisz wiedzieć, gdzie szukać informacji. Jeżeli masz już doświadczenie i wiedzę, wykorzystaj ją i pobaw się z nami. 

Terminy, które warto znać i próbować wykorzystać:

  • Znaczące nazwy (czyli zamiast zmiennych o nazwach h, m s zastosować hours, minutes, seconds) - jednak nie tylko w odniesieniu do zmiennych, ale też do klas i funkcji 
  • trzeba znać jakąkolwiek standaryzację pisania kodu - na przykład w PHP warto przeczytać o PSR-1 i PSR-2 - mówią one o tym jakie wcięcia w kodzie stosować, czy pisać camelCase czy pascalCase, czy UpperCase czy lowercase oraz o wielu wielu innych dobrych praktykach
  • Abstrakcja danych
  • Prawo Demeter
  • obsługa błędów
  • hermetyzacja danych
  • polimorfizm

Refaktoryzacja często się wiąże z czystym kodem (ang. clean code), dlatego warto poznać takie pojęcia jak:

  • S - zasada pojedynczej odpowiedzialności
  • O - zasada otwarte-zamknięte
  • L - zasada podstawiania Liskow
  • I - zasada segregacji interfejsów 
  • D - zasada odwracania zależności

Aby wiedzieć, która część kodu nadaje się do refaktoryzacji stosuje się technikę rozpoznawania "brzydkich zapachów", a to ich lista:

http://pastebin.com/0jen1ect

Oczywiście nie wymagam od nas wykorzystania tych wszystkich rzeczy - ten temat ma być edukujący, więc osoby, które nic nie wiedzą, właśnie się dowiedziały paru istotnych pojęć i w przyszłości będą mogły poszukać informacji o tych rzeczach. 

OGÓLNE ZASADY

Nie ma oceniania osób za to co piszą, jak piszą - każdy może się wypowiedzieć, każdy może tutaj wykazać się wiedzą lub chęcią do zdobycia jej. 
Chciałbym tylko zachować względny porządek w tym wątku, więc prosiłbym aby do zadanego kodu wypowiadać się tylko i wyłącznie pod postem z tym kodem. 

Tak pozatym to liczę na waszą współpracę i na to, że pomysł się spodoba :)

 

Miłej zabawy!

3 odpowiedzi

+3 głosów
odpowiedź 4 października 2015 przez event15 Szeryf (93,790 p.)
edycja 7 października 2015 przez event15

PROGRAM PIERWSZY

https://github.com/CodersCommunity/zabawa-w-refaktoryzacje-challange-forumowy/blob/OOP/program.cpp

(Edytowałem link na aktualny kod)

Aby przejrzeć jak plik zmieniał się można kliknąć history.

Hmm od czego by tu zacząć? :)

Zmiany nie muszą być ogromne, każda osoba może zaproponować chociażby po jednej krótkiej zmianie, np. "zmiana nazw zmiennych na czytelne" i podać ich przykłady, np. "zamiast h lepiej użyć hours". I tym podobne :)

LISTA ZMIAN/DOBRYCH RAD

  • zmiana nazw zmiennych, metod
  • usunięcie nadmiarowego kodu poprzez utworzenie tablic
  • zmiana programu na obiektowy!!!
komentarz 7 października 2015 przez event15 Szeryf (93,790 p.)
Dobra, trzeba tu wyjaśnić kwestię języka bo wchodzimy na wyższy poziom, co pewnie każdy dumnie wyczuwa - to się chwali.

Podział na warstwy został ładnie w issues wyjaśniony przez Efika.

Controller to w dużym skrócie byt, który jest pomiędzy logiką aplikacji a jej widokiem.

Widok to jest to co jest widoczne dla użytkownika, ale część tego widoku jest mocno związana z innymi warstwami (tworzenie planszy, ustawianie kolorow itp).

Na przykład tworzenie Planszy: Plansza jest modelem, posiada ona Pola. Rysowanie planszy jest tworzone w kontrolerze. Ale charakterystyka tych kwadracików czy pól już w modelu jest albo w jakimś konfigu.

Widok to jest wysoki poziom, on nie powinien zawierać w sobie nic związanego z ustawianiem stanów.

Jeżeli się mylę - linczować.
komentarz 7 października 2015 przez adrian17 Ekspert (344,100 p.)
Event(+efik?), jak najbardziej zgadzam się z izolacją logiki i warstwy renderującej, ale Ty tutaj próbujesz zaaplikować cały wzorzec MVC do gier komputerowych, podczas gdy z tego co wiem nie jest on do tych zastosowań ani popularny, ani dobry.

Patrycjerz, zrób na to osobny wątek, lepiej nie mieć zbyt dużo tematów na raz w jednej nitce komentarzy, już teraz to się ciężko czyta.
komentarz 7 października 2015 przez event15 Szeryf (93,790 p.)
Ok, @adrian17, a powiedzmy, że ktoś będzie chciał zrobić to w  OpenGl, albo w innej bibliotece graficznej? Co byś zaproponował?
komentarz 7 października 2015 przez Patrycjerz Mędrzec (192,340 p.)
Czytałem wczoraj coś o wzorcu zwanym Fasada. Nie wiem, czy nie jest to najprostszy sposób na rozdzielenie logiki gry (za fasadą) i reszty kodu. Co myślicie?
komentarz 7 października 2015 przez adrian17 Ekspert (344,100 p.)
Fasada -> możliwe że tak, ale nie jestem pewien; głównym celem tego wzorca jest odizolowanie złożonych zależności, a nie ułatwienie ich podmieniania. To znaczy faktycznie robi się takie API izolujące od niskopoziomowej grafiki, ale nie widziałem by w tym kontekście ludzie nazywali to fasadą.

W każdym razie w praktyce najczęściej twórcy po prostu tworzą kod pod jedną platformę, a jeśli trzeba zrobić wersje na kolejne to tworzą porty i niezależnie je kompilują. Gdy pecetowe w których kojarzę możliwość zmiany OGL/DX mogę policzyć na palcach. No, i Unity.

A co do ogólnego projektowania logiki w grach, całkiem popularny jest ECS.
0 głosów
odpowiedź 6 października 2015 przez event15 Szeryf (93,790 p.)
edycja 6 października 2015 przez event15

Weszliśmy w świat obiektów, więc myślę, że czas aby ludzie nie korzystający jeszcze z wzorców, dowiedzieli się czegoś więcej o nich:

Wzorce obiektowe w C++: https://github.com/jtherrell/DesignPatterns/tree/master/C%2B%2B

Wzorce obiektowe w PHP: http://designpatternsphp.readthedocs.org/en/latest/

Większy podział na języki: https://github.com/oxnz/design-patterns/tree/master/src

 
Tutaj o zaproponowanym przez @efik ValueObject:

http://it.esky.pl/2015/07/10/domain-driven-design-value-objects/


PS. Proszę tu nie odpowiadać - w tej odpowiedzi będę zamieszczać tylko linki do przydatnych materiałów.

0 głosów
odpowiedź 11 października 2015 przez event15 Szeryf (93,790 p.)
przywrócone 13 października 2015 przez event15

PROGRAM DRUGI

Program drugi to znany wszystkim QuickSort. Będzie dużo łatwiejszy w refaktoryzacji - tutaj głównie skupimy się na poprawieniu nazw zmiennych, ewentualnie czytelności kodu:

<?php
$unsorted = array(43,21,2,1,9,24,2,99,23,8,7,114,92,5);

function quick_sort($array)
{
	// find array
	$length = count($array);
	
	// base case test, if array of length 0 then just return array to caller
	if($length <= 1){return $array;}
	else{	
		// select an item to act as our pivot point, since list is unsorted first position is easiest
		$pivot = $array[0];
		
		// declare our two arrays to act as partitions
		$left = $right = array();
		
		// loop and compare each item in the array to the pivot value, place item in appropriate partition
		for($i = 1; $i < count($array); $i++){
			if($array[$i] < $pivot){$left[] = $array[$i];	}
			else{	$right[] = $array[$i];	}
		}
		
		// use recursion to now sort the left and right lists
		return array_merge(quick_sort($left), array($pivot), quick_sort($right));
	}
}

$sorted = quick_sort($unsorted);
print_r($sorted);

Program jest dużo łatwiejszy i myślę, że dużo szybciej pójdzie z pracą nad nim :) 

komentarz 7 listopada 2015 przez Bravo555 Gaduła (3,970 p.)
Programy nie będą publikowane na GitHubie? Osobiście uważam, że to dobry pomysł, każdy mógłby sklonować, zrobić swoje zmiany, wrzucić PR... I takie jedno zadanie będzie się kończyć kiedy wszystko będzie już zrobione.

Poza tym, przynajmniej poćwiczy się pracę w grupie, gdzie jeszcze inni użytkownicy wrzucają zmiany i trzeba się jakoś w tym odnaleźć.
komentarz 7 listopada 2015 przez Bravo555 Gaduła (3,970 p.)
No wiem, nawet popracowałem nad nim trochę, ale z tego co widzę jest też drugi, którego nie ma.

Podobne pytania

0 głosów
2 odpowiedzi 238 wizyt
+1 głos
4 odpowiedzi 628 wizyt
pytanie zadane 2 lipca 2015 w C# przez Lukasz Bywalec (2,320 p.)
0 głosów
2 odpowiedzi 372 wizyt

92,455 zapytań

141,263 odpowiedzi

319,099 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!

...