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

Nagromadzenie metod w klasie - JavaScript

Object Storage Arubacloud
+2 głosów
399 wizyt
pytanie zadane 14 października 2019 w JavaScript przez Falwack Początkujący (400 p.)

Witam! 

Mój problem jest zapewne błahy, jednak chciałbym się dowiedzieć, w jaki sposób (czy jest to w ogóle zalecane, czy tak powinno się robić) można "powyrzucać" metody z klasy. 

Już wyjaśniam o co chodzi, bo to na górze to nie jest zbyt najlepszy opis. Załóżmy taki blok kodu:

class X {

constructor() { ..}

m1() {...}
m2() {...}
m3() {...}
m4() {...}
m5() {...}
m6() {...}
m7() {...}
m8() {...}
m9() {...} 
m10() {...} 
m11() {...} 
}

Pozwoliłem sobie napisać ten kod poglądowo. Jak widać, w klasie X jest dość sporo metod, dokładnie w przykładzie 11, z czego są to różne metody typu renderCośTam(), addCośTam(), inicjalizacjaZmiennych(), róbToPoTym() itd. 

Aktualnie zakładając że są tam rozbudowane funkcje, kod w klasie X ma jakieś 350 stron. Nie mówię że to jest dużo, jednak zaczęło mnie zastanawiać, czy jest jakaś metoda "odseparowania" tych metod z klasy X, żeby ich tyle nie było w tej danej klasie. Bo zakładając rozbudowę projektu, okazuje się ze trzeba dorobić funkcjonalność i tutaj zostanie dodane kolejne 8 metod i załóżmy klasa X będzie miała 700 linijek kodu. 

Mam nadzieję, że w miarę jasno przedstawiłem swój "problem", który raczej nie jest problemem, a zwykłą chęcią pozyskania informacji. 

2 odpowiedzi

+3 głosów
odpowiedź 15 października 2019 przez Comandeer Guru (601,450 p.)

Co prawda odpowiedź @ShiroUmizake jest jak najbardziej poprawna, ale mam wrażenie, że średnio przydatna na tym etapie. IMO o wiele łatwiej będzie po prostu zastosować SOLID, a zwłaszcza zasadę kryjącą się pod S, czyli Single Responsibility Principle (Zasada Jednej Odpowiedzialności). Zakłada ona, że każda klasa powinna zajmować się tylko i wyłącznie jedną rzeczą. Załóżmy, że mamy hipotetyczną klasę zajmującą się pobieraniem i wyświetlaniem pewnych rzeczy (np. repozytoriów z GitHuba):

class GitHubInfo {
	getRepos() {}
	displayRepos() {}
	putReposInCache() {}
}

Już widać, że ta klasa tak naprawdę robi trzy rzeczy: pobiera repozytoria, wyświetla je oraz wsadza pobrane dane do cache. Stąd można ją podzielić na trzy mniejsze klasy:

class GitHubFetcher {
	get() {}
}

class GitHubRenderer {
	render() {}
}

class GitHubCache {
	put() {}
}

Natomiast klasa GitHubInfo mogłaby odtąd zajmować się koordynowaniem działania tych trzech klas (wykorzystać można do tego np. Dependency Injection):

class GitHubInfo {
	constructor( fetcher, renderer, cache ) {
		this.fetcher = fetcher;
		this.renderer = renderer;
		this.cache = cache;
	}

	generateInfo( name ) {
		const repo = this.fetcher.get( name );
		
		this.cache.put( repo );
		this.renderer.render( repo );
	}
}

const fetcher = new GitHubFetcher();
const renderer = new GitHubRenderer();
const cache = new GitHubCache();
const infoService = new GitHubInfo( fetcher, renderer, cache );

infoService.generateInfo( 'babel/babel' );
komentarz 15 października 2019 przez jared Gaduła (3,600 p.)
Ja tak przy okazji spytam, bo ostatnio trochę że tak ujmę "liznąłem" temat powierzchownie.

1. Czy w tym przykładzie klasa GitHubInfo realizuje tzw. kompozycję, której zasada działania polega na tym, że jeden obiekt wykorzystuje do działania inne obiekty?

2. Czy zamiast przyjmowania obiektów klas GitHubFetcher, GitHubRenderer, GitHubCache lepszym rozwiązaniem byłoby przyjęcie referencji do interfejsów?

Sory, że pytam, ale od czasu do czasu coś tam mrugnie mi jakieś fajne słówko, czy technika i tak nie bardzo wiem co z czym. A ja noob jestem, tu trochę coś się dowiem, tam znowu coś :)
1
komentarz 15 października 2019 przez Comandeer Guru (601,450 p.)

Czy zamiast przyjmowania obiektów klas GitHubFetcher, GitHubRenderer, GitHubCache lepszym rozwiązaniem byłoby przyjęcie referencji do interfejsów?

Samych referencji do interfejsów nie moglibyśmy przyjąć, moglibyśmy przyjąć instancje klas implementujących interfejs. Niemniej w przypadku JS-a to i tak średnio się przyda, bo nie istnieje w nim koncept interfejsu ;)

Czy w tym przykładzie klasa GitHubInfo realizuje tzw. kompozycję, której zasada działania polega na tym, że jeden obiekt wykorzystuje do działania inne obiekty? 

Tak. 

1
komentarz 15 października 2019 przez Falwack Początkujący (400 p.)

@Comandeer

Jeszcze ja pozwolę sobie zapytać, trochę odbiegając od tematu. Czy tworzenie klasy, która ma zaledwie jedną metodę i nic więcej, jest sensowne, czy jest to błędem? 

Ponieważ w projekcie mam taką klasę która odpowiada za generowanie losowych liczb z danego zakresu i ona posiada właśnie tylko jedną metodę. Niektórzy twierdzą że to jest błędne, niektórzy twierdzą że nic w tym złego nie ma. A jakie jest Twoje zdanie na ten temat?

 

Oczywiście dziękuje za wyczerpującą odpowiedź, zastosuję Twoje rady w swoim projekcie :)

1
komentarz 15 października 2019 przez Comandeer Guru (601,450 p.)

Czy tworzenie klasy, która ma zaledwie jedną metodę i nic więcej, jest sensowne, czy jest to błędem? 

Spotkałem się już z osobami twierdzącymi, że klasa z więcej niż jedną metodą jest błędem ;) Jeśli faktycznie klasa robi jedną rzecz i potrzebuje do tego tylko jednej metody, to ok. Inna rzecz, że akurat w JS-ie nie trzeba wszystkiego pakować do klas i można sobie pozwolić na zamienienie klas z jedną metodą po prostu na moduł eksportujący funkcję. 

+1 głos
odpowiedź 15 października 2019 przez ShiroUmizake Nałogowiec (46,300 p.)

Możesz wydzielić model domenowy (obiekt z danymi), serwis który obsługuje renderCośTam czy sam Manager który steruje zachowaniami (róbToPoTym). A jeżeli więcej asymchronicznośći to na przykład commandBus.

https://tactician.thephpleague.com/

komentarz 15 października 2019 przez Falwack Początkujący (400 p.)
Dziękuję, przestudiuję materiał spod linku :)

Podobne pytania

+2 głosów
1 odpowiedź 369 wizyt
pytanie zadane 20 czerwca 2016 w C i C++ przez JAKUBW Nałogowiec (33,470 p.)
0 głosów
1 odpowiedź 149 wizyt
pytanie zadane 10 grudnia 2018 w C i C++ przez jednooki23 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 271 wizyt
pytanie zadane 12 lipca 2022 w C i C++ przez cpp_lover Początkujący (290 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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!

...