Witam serdecznie,
dzisiaj zajmiemy się zasadą pojedynczej odpowiedzialności ("Single Responsibility principle").
Jest to jedna z prostszych zasad, a jest bardzo często łamana u programistów Javy.
Jej opis, to taki, że każda powinna wykonywać jedną i tylko jedną funkcjonalność. W sensie powinna być odpowiedzialna za wybraną funkcjonalność.
No dobra, to teraz pytanie jak programiści łamią tę zasadę?
A no np. tak:
import java.util.Random;
public class IntelligentSteemitMonkey {
private static Random r = new Random();
public boolean coolMethodDoingToMuch() {
boolean didndunothing = false;
boolean dontLie = true;
String textForSteemit = writePostForSteemit();
publishOnSteemit(textForSteemit);
didndunothing = dontLie;
return didndunothing;
}
private String writePostForSteemit() {
String newTextOnSteemit = "";
String[] chars = {"a", "b", "c", "d", " ", "ę", "f", " ", "z", "g", "G", "ł", "n"};
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 1000; i++) {
int index = r.nextInt(chars.length);
stringBuilder.append(chars[index]);
}
newTextOnSteemit = stringBuilder.toString();
return newTextOnSteemit;
}
private boolean publishOnSteemit(String text) {
//magic happens
System.out.println(text);
return true;
}
}
Załóżmy, że zatrudniliśmy super inteligentną małpkę, co piszę za nas posty na steemicie i je publikuje.
Ale jak możemy tak wykorzystywać biedną małpkę i kazać jej robić dwie rzeczy, a nawet i trzy!.
Przecież aż taka inteligentna ona nie jest. A jak jej każemy coś jeszcze zrobić, to już w ogóle może przestać robić cokolwiek.
To jak możemy to naprawić i pozwolić małpce tylko pisać nam posty na steemicie?
Możemy oddelegować nowego pupila do publikowania tekstu, co małpka nam stworzyła.
No powiedzmy, że nawet temu ślimakowi. Myślę, że mu się nigdzie nie śpieszy, a raczej nie będzie narzekał na pracę.
No to spróbujmy to odwzorować w kodzie:
public class WannabeRichSteemian {
public boolean coolMethodDelegatingEverythingToHisPuppils() {
boolean didndunothing = false;
boolean dontLie = true;
IntelligentSteemitMonkey intelligentSteemitMonkey = new IntelligentSteemitMonkey();
SuperSlowHappySnail superSlowHappySnail = new SuperSlowHappySnail();
String textForSteemit = intelligentSteemitMonkey.writePostForSteemit();
superSlowHappySnail.publishOnSteemit(textForSteemit);
didndunothing = dontLie;
return didndunothing;
}
}
import java.util.Random;
public class IntelligentSteemitMonkey {
private static Random r = new Random();
public String writePostForSteemit() {
String newTextOnSteemit = "";
String[] chars = {"a", "b", "c", "d", " ", "ę", "f", " ", "z", "g", "G", "ł", "n"};
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 1000; i++) {
int index = r.nextInt(chars.length);
stringBuilder.append(chars[index]);
}
newTextOnSteemit = stringBuilder.toString();
return newTextOnSteemit;
}
}
public class SuperSlowHappySnail {
public boolean publishOnSteemit(String text) {
//magic happens
System.out.println(text);
return true;
}
}
Jak widzicie, z jednej klasy utworzyły się nawet trzy klasy.
Pierwsza klasa deleguje innych do roboty ("I zbiera steemy xd"). Natomiast inni zajmują się tworzeniem tekstu i jego publikowaniem.
I tak, oto możecie wykorzytać zasadę o pojedynczej odpowiedzialności klasy.
Jeżeli macie jakiekolwiek pytania, to pisać w sekcji komentarzy :)