Loading...
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Здравей,

Днес на упражнението Филип Колев обясняваше точно тази задача:

ако вече си създал методите,

* първо по картинката дадена с Step 3. Loose Coupling от указанието към задачата трябва да се промени конструктора на BookStoreEngine, така че вче да приема два аргумента:

public BookStoreEngine(IRenderer renderer, IInputHandler inputHandler)

{

}

* после в Main метода създаваш инстанции на двата метода:

IRenderer renderer = new ConsoleRenderer();

IInputHandler inputHandler = new ConsoleInputHandler();

* и сега вече BookStoreEngine engine = new BookStoreEngine(renderer, inputHandler);

 

 

-2
11/06/2015 22:35:25
RoYaL avatar RoYaL Trainer 6849 Точки

Може да гледате на всичко това (конструктори, методи...) като на най-обикновени Функции

Ако се водим по най-простия пример от статията, то конструкторът BookStoreEngine() излиза, че е нещо като функция, която не приема аргументи а просто извършва сметки с някакви числа, например f() = 5 + 6 т.е. супер конкретно. Искаме обаче тези 5 и 6 да са каквито и да е числа, които да подадем отвън, съответно как променяме функцита?

f(x, y) = x + y

1
GalyaGeorgieva avatar GalyaGeorgieva 88 Точки

Въпрос?

Точно в Step 3
трябва да подменим (Decoupling) console  с this.renderer.WriteLine и вместо:

no   Console.WriteLine(commandResult);

yes   this.renderer.WriteLine("Total revenue: {0}",this.revenue.ToString());

При мен подчертава в червено, защото иска в интерфейса IRenderer (който реално държи метода WriteLine()) да сложа два параметъра:

- един  string за текста "Total revenue: " и

- един  string за this.revenue.ToString()

Въпросът е защо ми го иска този стринг за "Total revenue: " да е параметър в метода WriteLine()) ? И как е правилно да стане?


Поздрави, Галя.

0
RoYaL avatar RoYaL Trainer 6849 Точки

Идеята е, че конзолата например, вътре в себе си имплементира string.Format. Когато искаш да ползваш плейсхолдъри, можеш да го постигнеш направо с Console.WriteLine().

Твоят пример е аналогичен на

Console.WriteLine("Total {0}", 10000);

И съответно въпросът е, защо методът WriteLine() на конзолата изисква това "Total {0}". Не го изисква, просто ако не го напишеш ще изпринтира "10000", а ти искаш да изпринтира "Total 10000".

Ако приемаше само един аргумент, за да постигнеш това с плейсхолдърите, трябваше да пратиш string.Format() на конзолата.

Console.WriteLine(string.Format("Total {0}", 10000));

Което е излишно затруднение.

Сега обаче пред теб идва въпросът, как така като съм направила метод да приема два аргумента, да му подам един. Два варианта: правиш вторият аргумент незадължителен или по-правилният - правиш овърлоуди на метода.

Така както е даден по условие методът WriteLine в ConsoleUserInterface би трябвало да работи и с един и с два параметъра.  Има вариант да не си направила по този начин точно интерфейса и да са станали и двата параметъра задължителни.

 

1
GalyaGeorgieva avatar GalyaGeorgieva 88 Точки

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

Кодът е ТУК

 

п.п. не съм направила FileRenderer напълно... мисля, че се затрудних или изморих... :)

0
Filkolev avatar Filkolev 4482 Точки

То не се и изисква да се прави File Renderer, просто е споменато, че с добра абстракция и използване на интерфейси пренасочването на изхода от конзолата към файл е лесно. Който има желание - доста добро упражнение е да се направи и това.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.