Професионална програма
Loading...
+ Нов въпрос
Simooo93 avatar Simooo93 81 Точки

High-Quality Code - Solid Principle In Software Design[Homework]

Здравейте,

най-накрая домашно, което да ми допадне за писане. Не знам на вас дали ви беше интересно, но лично на мен това ми беше най-приятно. Искам да го споделя с вас и дадете съвети, ако има нещо объркано: 

Logger

Тагове:
3
C# OOP Advanced 27/01/2016 09:29:05
RFilipov avatar RFilipov 136 Точки

Имаш повтаряща се логика в Appender класовете поради липса на абстракция. Направи абстрактен клас Appender, който да наследява и да има следното:

public string Path { get; set; }
public ILayout Layout { get; set; }
public abstract void Append(ILogable message);

Console Appender директно го наследява. FileAppender наследява Appender + един допълнителен интерфейс, който позволява записване във файлове съдържащ:

string FilePath { get; set; }

Можеш да приложиш и SimpleFactory щаблона във вид:

public abstract class Layout : ILayout
{
    protected Layout()
    {
       this.InitializeFormat();
    }

    public string Format { get; protected set; }

    public abstract void InitializeFormat();
}

И наследяващият клас:

public class SimpleLayout : Layout
{
    public override void InitializeFormat()
    {
        this.Format = "{0} - {1} - {2}";
    }
}

XmlLayout е на същият принцип. Инициализация на абстрактния метод и въвеждане на формата, който трябва да се използва при принтиране.

 

2
Simooo93 avatar Simooo93 81 Точки

Супер, мерси за насоките ;) 

0
IvelinaVasileva avatar IvelinaVasileva 20 Точки

Колега,

Напълно съгласна съм с теб! Това е домашно, в което да използваш въображението си. Напоследък ми омръзна да променям имена на променливи в някой омазан код. 

Иначе относно твоето домашно - замислих се дали има нужда от struct Message. Може просто метода Log() да приема от метода, който го извиква (Info, Warning, etc.), и параметър Type. Не, че е грешно, но ще е по-опростено.

2
Simooo93 avatar Simooo93 81 Точки

Това, което исках да постигна с ILogger е да имам по-добра структура какво точно може да се логва, тъй като ми се струваше малко разпиляно да си слагам някакви стрингове постоянно. Така примерно може да имам някакъв по-голям обект, който да имплементира ILogger или да го съдържа като променлива и така може да работим с него като се подава, а не стринговете да падат като магически числа. Заради това го направих, но наистина и аз се чудих дали да го сложа дали не, но тъй като е домашно реших да го ползвам.

Поздрави,

Симеон

0
ToniBeliyashki avatar ToniBeliyashki 11 Точки

Здравейте!

Ето и моето домашно. Ще се радвам на всякакви съвети и feedback.

:)
 

1
mishomihaylov avatar mishomihaylov 67 Точки

Здравей Тони! 
Дойде ми на ум да ти напиша едно две неща :) :
1. Не оставяй неизползвани импортнати библиотеки отгоре, не ти трябват най-малкото.
2. В SimpleLayout, метода FormatMessage можеш да приемаш много на брой аргументи, което не е правилно, защото програмата ще се компилира и при един подаден параметър, но при изпълнението ще гръмне, а така или иначе знаеш, че ще използваш само 2. В Append пак приемаш доста аргументи, каква е причината за това ?
3. Мисля, че с тези enum-ерации си усложняваш работата, особено при апендването.

 

1
ToniBeliyashki avatar ToniBeliyashki 11 Точки

Здравей Мишо! 
За библиотеките си прав да... винаги забравям да ги махна.
Относно броя параметри - опитах се да обхвана възможно най-много варианти на Appender-и и Layout-и, тъй като не е казано, че например един бъдещ Appender, няма да може да append-ва освен съобщение, ReportLevel и дата, и някакви други неща. При което, ако сигнатурата на методите в самите ILayout и IAppender е с точно определен брой и точно определен тип параметри, ще се наложи да се бръкне в кода и да се добавят новите параметри. 
Може би не съм разбрал условието правилно.
А това с enum-ерациите го написах за да може да се имплементира другата логика.

Иначе благодаря ти за feedback-a. :)

0
28/01/2016 12:54:59