Cześć, zagłębiając się w temat SOLID'nego kodu analizuję pierwszą zasadę SRP. W związku z tym napisałem kawałek kodu i rodzą mi się dwa pytania/tematy do rozmyśleń. Pierwsze pytanie brzmi następująco: Czy poniższa klasa łamie zasadę SRP ?
public class Pracownik()
{
public void WydrukujDanePracownika();
public void PobierzDanePracownika();
public void ObliczPensjePracownika();
}
Osobiście uważam, że na podstawie powyższego kodu nie jesteśmy w stanie tego stwierdzić, ponieważ nie wiemy, w jaki sposób implementowane są w/w metody. Wydaje mi się, że jeżeli metody te są implementowane za pomocą innych klas (klasa drukująca, pobierająca dane i obliczająca pensję) to zasada SRP jest spełniona, a klasa Pracownik posiada metody, które pozwolą wyeksponować funkcjonalność daną pracownikowi.
Drugie pytanie brzmi następująco: **Czy poniższy kod łamie zasadę SRP, bądź inną SOLID'ną ? **
public interface IGeneratorRaportow
{
void GenerujRaport(IModul modul);
}
public interface IDrukowanie
{
void DrukujRaport(IModul modul);
}
public class GenerujRaportXml : IGeneratorRaportow
{
public void GenerujRaport(IModul modul)
{
modul.TrescRaportu = "tresc raportu w formacie XML.";
}
}
public class GenerujRaportText : IGeneratorRaportow
{
public void GenerujRaport(IModul modul)
{
modul.TrescRaportu = "tresc raportu w formacie tekstowym.";
}
}
public class DrukujRaportXml : IDrukowanie
{
public void DrukujRaport(IModul modul)
{
var tekst = string.IsNullOrEmpty(modul.TrescRaportu)
? "Brak tresci raportu."
: string.Format("Wydrukowano w formacie XML'owym {0}", modul.TrescRaportu);
Console.WriteLine(tekst);
}
}
public class DrukujRaportText : IDrukowanie
{
public void DrukujRaport(IModul modul)
{
var tekst = string.IsNullOrEmpty(modul.TrescRaportu)
? "Brak tresci raportu."
: string.Format("Wydrukowano w formacie tekstowym {0}", modul.TrescRaportu);
Console.WriteLine(tekst);
}
}
public enum JakiZapis
{
Xml,
Text,
};
public interface IFactory
{
IDrukowanie UtworzObiektDrukowania(JakiZapis param);
IGeneratorRaportow UtworzObiektGenerowania(JakiZapis param);
}
public class Factory : IFactory
{
public IDrukowanie UtworzObiektDrukowania(JakiZapis param)
{
switch (param)
{
case JakiZapis.Text:
return new DrukujRaportText();
case JakiZapis.Xml:
return new DrukujRaportXml();
default:
return null;
}
}
public IGeneratorRaportow UtworzObiektGenerowania(JakiZapis param)
{
switch (param)
{
case JakiZapis.Text:
return new GenerujRaportText();
case JakiZapis.Xml:
return new GenerujRaportXml();
default:
return null;
}
}
}
public interface IModul
{
string TrescRaportu { get; set; }
}
public class Modul : IModul
{
private readonly IFactory _factory;
public Modul(IFactory factory)
{
_factory = factory;
}
public string TrescRaportu { get; set; }
public void GenerujRaport(JakiZapis wyborTypuRaportu)
{
var obiekt = _factory.UtworzObiektGenerowania(wyborTypuRaportu);
obiekt.GenerujRaport(this);
}
public void DrukujRaport(JakiZapis wyborTypuRaportu)
{
var obiekt = _factory.UtworzObiektDrukowania(wyborTypuRaportu);
obiekt.DrukujRaport(this);
}
}
class WyswietlenieProgramuNaEkran
{
private static void Main()
{
var mojModul = new Modul(new Factory());
mojModul.GenerujRaport(JakiZapis.Xml);
mojModul.DrukujRaport(JakiZapis.Text);
Console.ReadLine();
}
}