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

Jak długa może być 'klasa' (class)

Object Storage Arubacloud
0 głosów
773 wizyt
pytanie zadane 15 lipca 2015 w Nasze projekty przez makoso Mądrala (7,380 p.)
tak jak w temacie jak polecaCie? nie ograniczona bo tak prawie wszystko siedzi mi w jednej klasie i nie wiem czy to dobrze :)

4 odpowiedzi

+2 głosów
odpowiedź 15 lipca 2015 przez efiku Szeryf (75,160 p.)
Skoro masz wszystko w 1 klasie to znaczy, że masz BOSKĄ KLASĘ.
Klasa powinna być stworzona wg zasady pojedyńczej odpowiedzialności. Lepiej podzielić na klika mniejszych klas.

Zakup sobie książkę Czysty kod  Martina, bo to taki must have! :)

Poczytaj o SOLID. https://scotch.io/bar-talk/s-o-l-i-d-the-first-five-principles-of-object-oriented-design

Fajnie, że zacząłeś zwracać uwagę na takie rzeczy. ;)
komentarz 15 lipca 2015 przez Comandeer Guru (601,510 p.)
Ta książka jest ciut dogmatyczna - warto o tym ostrzec, żeby nie było ;)
komentarz 15 lipca 2015 przez efiku Szeryf (75,160 p.)
komentarz 15 lipca 2015 przez makoso Mądrala (7,380 p.)

właśnie zakończyłm 404 linijkę i dlatego napisałem :)

jest to klasa gracza posiadająca funkcje gracza typu jego surowce itp ale także akcje typu budowa i chyba tylko np akcje mogę sobie przenieść do innej klasy kiedys coś próbowałem ale mi nie chciało działać i tak poleciałem w jedną tutaj mam 400 linijek ale wiem że pewnie jakbym ją teraz dokładnie przejżał to będzie około 300 po skróceniu podzielę się ostatnią funkcję może na przykładnie tego podpowiecie jak to skracać czy się da funkcję uprościć :)

 

	public function wojsko_koszt($jednostka)
    {
		$sql = "SELECT * FROM wojsko_wymagania WHERE jednostka = ? " ;
        $prepared = $this->pdo->prepare($sql);
        $prepared->bindParam(1,$jednostka,\PDO::PARAM_STR);
        $prepared->execute();
		$this->wojsko_wymagania = $prepared->fetch(\PDO::FETCH_OBJ);
		$badanie=$this->wojsko_wymagania->badanie;
		list($budynek, $budyneklvl) = explode('__',$this->wojsko_wymagania->budynek);
		if($this->budynki->{$budynek} < $budyneklvl){return 'Rozbuduj budynek '.$budynek.' do poziomu '.$budyneklvl;}
		elseif($this->budynki->{$budynek} >= $budyneklvl)
			{	
				$badanie_spr=$this->badanie_war($badanie);
				if($badanie_spr==0){return 'Nie zbadałeś badania '.$badanie.' w kuźni';}
				elseif($badanie_spr==1)
					{									
						$sql = "SELECT * FROM wojsko_koszt WHERE jednostka = ? " ;
						$prepared = $this->pdo->prepare($sql);
						$prepared->bindParam(1,$jednostka,\PDO::PARAM_STR);
						$prepared->execute();
						$this->wojsko_koszt = $prepared->fetch(\PDO::FETCH_OBJ);
						if($this->wojsko_koszt->inna_jednostka_ilosc >=1)
							{
								return 'Jednostka: '.$this->wojsko_koszt->jednostka.' Złoto: '.$this->wojsko_koszt->zloto.' Zywność: '.$this->wojsko_koszt->zywnosc.' Jednostki: '.$this->wojsko_koszt->inna_jednostka.' '.$this->wojsko_koszt->inna_jednostka_ilosc.' Czas Szkolenia: '.$this->wojsko_koszt->czas;
							}
						elseif($this->wojsko_koszt->inna_jednostka_ilosc ==0)
							{
							return 'Jednostka: '.$this->wojsko_koszt->jednostka.' Złoto: '.$this->wojsko_koszt->zloto.' Zywność: '.$this->wojsko_koszt->zywnosc.' Jednostki: Cłop '.$this->wojsko_koszt->chlop.' Czas Szkolenia: '.$this->wojsko_koszt->czas;
							}						
					}
			}
    }

 

komentarz 15 lipca 2015 przez efiku Szeryf (75,160 p.)
Hmm na chwile obecna mam sporo na glowie.

Czy moglbys tamten komentarz z kodem wywalic ( sam kod ) i wrzucic na pastebin ( zaznacz ze to php) , ale cala klase? ;) Bardzo Cie prosze ;D
komentarz 15 lipca 2015 przez makoso Mądrala (7,380 p.)
będziesz się smiał jak nic :D
komentarz 15 lipca 2015 przez makoso Mądrala (7,380 p.)

kod całej klasy tak aby można było mnie zrównać z poziomem :)
https://gist.github.com/anonymous/a1b335189b821d301367

 

na tym forum powinna być możliwość wstawienia spoilera w niego możnaby było ładnie wstawiać kod tutaj :)

+1 głos
odpowiedź 15 lipca 2015 przez Dorion300 Szeryf (90,250 p.)
edycja 15 lipca 2015 przez Dorion300
W jakim sensie "duże"?

Opisz dokładniej.

Do czego jest ci klasa potrzebna i do czego chcesz ją użyć.

Klasy mogą być naprawde duże jak string.

Warto jeszcze dodać że jest takie coś jak dziedziczenie które pozwala skrócenie czasu jego tworzenia bez copy&paste z innego i zmniejsza zapotrzebowanie na linijki kodu.
komentarz 15 lipca 2015 przez makoso Mądrala (7,380 p.)

kod całej klasy tak aby można było mnie zrównać z poziomem :)
https://gist.github.com/anonymous/a1b335189b821d301367

tutaj uzyskasz odpowiedź do czego mi potrzebna itp :)

komentarz 15 lipca 2015 przez Dorion300 Szeryf (90,250 p.)
Nie wiem czy to dobry pomysł wpakować wszystko w jedną klasę.

również można zrobić obiekt w klasie (Tworzysz klasę która będzie w obiekcie)

np. Obiekt "wojsko" i to wojsko będzie przechowywało wszystkie najważniejsze informaje o twoim stanie wojska i wszystkie funkcje.

przez co klasa "gracz" jest mniej przeciążona, a ty masz o wiele ładniej posortowane.

Tak samo można zrobć klasę "budynki" która będzie przepisem na obiekt w "gracz" i będzie posiadał najważniejsze informacje o budynkach (lvl, hp) jak i o funkcjach które ulepszają te budynki.

 

Może serializacja ci pomoże na sprawne wczytywanie i zapisywanie klas głównych:

http://php.net/manual/en/class.serializable.php
komentarz 15 lipca 2015 przez makoso Mądrala (7,380 p.)
edycja 15 lipca 2015 przez makoso

nie bardzo rozumiem chodzi o to że w klasie mam 'uchwyt' do new class wojsko;

i odzielna klasa wojsko ?

czy coś takiego np:

class gracz($id){

function surowce(){//zwracam obiekt zawierający surowce
}
function budynki(){//zwracam obiekt zawierający lvl-e budynków
}
function wojsko(){//zwracam obiekt zawierający posiadane wojsko
}
function budowa(){
$x=new budowa($id, $this->surowce, $this->budynki);
return $x;
}

}

class budowa
{
function __construct ($id, $surowce, $budynki);
    {
       //konstruktor itp
     }
function rozbuduj($co){
    //rozbudowa
    }

//itd
}

 

// i potem wywołanie np jako 

$gracz=new gracz($id);
$buduj=$gracz->rozbuduj;
$buduj->rozbuduj(''koszary'');

czy takie coś ma prawo bytu czy nie?

komentarz 15 lipca 2015 przez Dorion300 Szeryf (90,250 p.)

Tworzysz klasę "wojsko"

Tam masz wszystkie funkcje/medoty i zmienne.

 

A potem w klasie głównym robisz takie coś:

$wojsko = new Wojsko;

z tym obiektem operujesz jak z obiektem głównym.

komentarz 15 lipca 2015 przez makoso Mądrala (7,380 p.)
czyli w klasie operuję na innej klasie tak jak operuję w pliku głównym tak?
komentarz 15 lipca 2015 przez Dorion300 Szeryf (90,250 p.)
Tak, jeśli chcesz się bezpośrednio poza klasa to robisz takie coś "$gracz->wojsko->zmienna" tu masz trochę większe info: http://www.hackingwithphp.com/6/6/0/objects-within-objects
komentarz 15 lipca 2015 przez makoso Mądrala (7,380 p.)
dobra chyba kminię jdopiero pojutrze bedę miał czas na to :( ale chociaż bd miał czas aby to wszystko przemyślec ;)

Wielkie dzięki zawsze masa osób mi pomaga :)
+1 głos
odpowiedź 15 lipca 2015 przez rafal.budzis Szeryf (85,260 p.)
Kiedyś słyszałem ze plik większy niż 500 linijek staje się już nie czytelny ale niewiem czy warto się tego trzymać. Jeśli potrzebujesz taką sporą klase to spoko ale zapewne jej nie potrzebujesz.(Jak zaczynasz z obiektowością to sam do tego dojdziesz ze tego nie potrzebujesz) Na pewno warto patrzyć na długośc poszczególnych metod. Funkcja nie powinna przekraczać 100 linijek oczywiście to tylko takie ogólne wskazówki nie którzy twierdzą ze pojedyńcza funkcja powinna mieścić się w całosci na ekranie i to chyba najlepszy wyznacznik jeśli programujesz dla siebie.
komentarz 15 lipca 2015 przez makoso Mądrala (7,380 p.)
wyżej w komentarzach podałem ostatnią funkcję ( a to nie koniec :( ) i przy sporym pomniejszeniu dopiero się mieści :)
komentarz 15 lipca 2015 przez rafal.budzis Szeryf (85,260 p.)

Przydało by się zobaczyć coś więcej ale kilka uwag już mam używasz else if gdzie nie sa one potrzebne pamietaj ze return kończy działanie funkcji. Bez sensu jest delkarować zmienną sql nic ci to nie daje oprócz zadeklarowania pamięci. Bardzo fajnie ze warunek co do badań wydzieliłeś na funkcje. Pewnie był złożony i super ale badanie_war nic nie mówi znacznie lepsze by bylo czy_stac_mnie _na_badania bardziej opisowe dzięki temu kod jest równocześnie komentarzem do kodu.

<?
public function wojsko_koszt($jednostka)
{
    $prepared = $this->pdo->prepare("SELECT * FROM wojsko_wymagania WHERE jednostka = ? ");
    $prepared->bindParam(1,$jednostka,\PDO::PARAM_STR);
    $prepared->execute();
    $this->wojsko_wymagania = $prepared->fetch(\PDO::FETCH_OBJ);
    $badanie=$this->wojsko_wymagania->badanie;
    list($budynek, $budyneklvl) = explode('__',$this->wojsko_wymagania->budynek);
    if($this->budynki->{$budynek} < $budyneklvl)
	{
		return 'Rozbuduj budynek '.$budynek.' do poziomu '.$budyneklvl;
	}
	//nie musisz else if`a robić return zakończy funkcje 
 
	$badanie_spr=$this->badanie_war($badanie);
	if($badanie_spr==0)
	{
		return 'Nie zbadałeś badania '.$badanie.' w kuźni';
	}
	if($badanie_spr==1)
	{
		$prepared = $this->pdo->prepare("SELECT * FROM wojsko_koszt WHERE jednostka = ? ");
		$prepared->bindParam(1,$jednostka,\PDO::PARAM_STR);
		$prepared->execute();
		$this->wojsko_koszt = $prepared->fetch(\PDO::FETCH_OBJ);
		if($this->wojsko_koszt->inna_jednostka_ilosc >=1)
		{
			return 'Jednostka: '.$this->wojsko_koszt->jednostka.' Złoto: '.$this->wojsko_koszt->zloto.' Zywność: '.$this->wojsko_koszt->zywnosc.' Jednostki: '.$this->wojsko_koszt->inna_jednostka.' '.$this->wojsko_koszt->inna_jednostka_ilosc.' Czas Szkolenia: '.$this->wojsko_koszt->czas;
		}

		return 'Jednostka: '.$this->wojsko_koszt->jednostka.' Złoto: '.$this->wojsko_koszt->zloto.' Zywność: '.$this->wojsko_koszt->zywnosc.' Jednostki: Cłop '.$this->wojsko_koszt->chlop.' Czas Szkolenia: '.$this->wojsko_koszt->czas;
	}
   
}
?>

p.s ja wole nazywanie bez _ i po angielsku lepiej by brzmiało :) bo słowa kluczowe są po angielsku lepiej się czyta kod jak jest w jednym jezyku fajnie by mieć to na uwadze przy kolejnych projektach w tym już się nie opłaca :)

komentarz 15 lipca 2015 przez makoso Mądrala (7,380 p.)
edycja 15 lipca 2015 przez makoso

dzięki wiedza o tym że return kończy działanie funkcji mi się przyda szukałem o tmy na necie i nie znalazłem stąd ten kod ifów :) badanie_war  to skrót od badanie_wartość gdzie badanie to nazwa tabeli a wartość kolumny 1 oznacza zbadano 0 nie zbadano to z funkcją wydzieloną to dopiero teraz zrozumiałem działanie $this i dlatego wcześniej tego nie uzywałem :( teraz wiem że klasę pewnie do jakiś 200 linijek mógłbym ukrócić a nawet do mniejszej ilości gdybym stworzył sobie np oddzielną klasę funkcje i wniej po zapisywał proste funkcje które używam w kodzie i w klasach i jeżeli teraz do tej klasy bym dał extends funkcje to wszystko by działało? bo kiedyś coś próbowałem nie wyszło i tak się zraziłem ze nie próbowałem więcej :) co do angielskich nazw fajnie by brzmiało ale jakoś tak mam że lubię sobie czasami czytać swój kod od początku do końca tak jakbym komuś tłumaczył :) a mając angielskie nazwy to zawsze śmierdzi mi to gotowcem jakoś nie wiem tak mam :)

 

ale i tak najbardziej dumny jestem z osiągnięcia tego: 

$this->budynki->{$budynek}
{$budynek}

gdzie $this->budynki to fetch tabeli budynki gracza a $budynek to nazwa tabeli czyli tez nazwa budynku :)

nie szukałem tego na necie kminiłem sam chyba z 40min wiele prób i błędów ale w końcu wyszło jaka to ulga była :) 

 

kod całej klasy tak aby można było mnie zrównać z poziomem :)
https://gist.github.com/anonymous/a1b335189b821d301367

0 głosów
odpowiedź 15 lipca 2015 przez niezalogowany
Klasę ograniczas do konkretnej funkcjonalności. Jeśli nadal jest spora, ale mimo wszystko zawarta jest w niej logika niezbędna do jej funkcjonowania to w gruncie rzeczy jest OK. Choć zdaję sobie sprawę, że może być Ci ciężko to ocenić na tym etapie nauki.

Podobne pytania

0 głosów
0 odpowiedzi 131 wizyt
pytanie zadane 5 grudnia 2018 w PHP przez s4bek Użytkownik (600 p.)
0 głosów
1 odpowiedź 570 wizyt
pytanie zadane 27 października 2020 w PHP przez Głupia546 Nowicjusz (180 p.)
0 głosów
1 odpowiedź 4,117 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...