Евгений Колесников 1 year ago
parent
commit
0ec7c29e28
2 changed files with 41 additions and 26 deletions
  1. 1 1
      articles/5_3_1_10_unit_test.md
  2. 40 25
      articles/5_3_1_9_classlib.md

+ 1 - 1
articles/5_3_1_10_unit_test.md

@@ -8,7 +8,7 @@
 
 ### Именование проектов
 
-в С# тест реализуется как отдельный проект в том же "решении".
**С#** тест реализуется как отдельный проект в том же "решении".
 
 К наименованию проекта добавляется суффикс "**.Tests**". То есть, если основной проект у нас называется, например, "*Demo*", то тестирующий проект должен называться "*Demo.Tests*"
 

+ 40 - 25
articles/5_3_1_9_classlib.md

@@ -23,9 +23,24 @@
 Реализуйте метод, который принимает в себя список объектов даты и времени по совершенным покупкам/заказам в рамках нашей компании, а возвращает список дат (без времени), отсортированный в порядке уменьшения частоты заказов. Это необходимо, чтобы наша компания могла прогнозировать наиболее высокий спрос на следующий год для обеспечения более качественного оказания услуг.
 
 Возвращаемые данные должны содержать только даты для первого числа каждого месяца и `00:00` минут. 
-Например, вам поступили следующие данные: `2019-12-12 14:43, 2019-12-01 15:05, 2019-11-04 09:01`, а, значит, самый популярный месяц - декабрь. Вам необходимо вернуть следующие данные: `2019-12-01 00:00, 2019-11-01 00:00`. В случае совпадения характеристик популярности сперва нужно вывести более ранние месяцы.
+Например, вам поступили следующие данные: 
 
-Прогноз строится на основе предыдущего года. ~~Так что данные Вам будут выдаваться строго за предыдущий год.~~ *Данные будут произвольные, поэтому даты не удовлеторяющие этому условию нужно игнорировать.*
+```
+2019-12-12 14:43
+2019-12-01 15:05
+2019-11-04 09:01
+```
+
+Значит, самый популярный месяц - декабрь (два заказа). Вам необходимо вернуть следующие данные: 
+
+```
+2019-12-01 00:00
+2019-11-01 00:00
+```
+
+В случае совпадения характеристик популярности сперва нужно вывести более ранние месяцы.
+
+Прогноз строится на основе предыдущего года. *Данные будут произвольные, поэтому даты не удовлеторяющие этому условию нужно игнорировать.*
 
 ### Спецификация метода
 
@@ -43,16 +58,15 @@
 
 ### Создание библиотеки классов
 
-Создаем **новое решение**, выбрав шаблон `.NET / Class Library`.
+Создаем **новый** проект, установив нужные фильтры (*C#*, *Windows*, *Библиотека*) и выбрав проект для соответствующей платформы. **Мы всё делаем для .NET Core**.
 
-![создание проекта](../img/rider016.png)
+![создание проекта](../img/test_01.png)
 
 Не забываем указывать название проекта по требованиям из ТЗ. Как вы тут напишете, так dll и будет называться.
 
-В итоге IDE создаст нам "рыбу" с одним файлом:
-
-![](../img/rider017.png)
+![ввод названия](../img/test_02.png)
 
+В итоге IDE создаст нам "рыбу" с одним файлом:
 
 ```cs
 namespace CompanyCoreLib
@@ -66,8 +80,6 @@ public class Class1
 
 По ТЗ наш класс должен называться **Analytics** - в *обозревателе решений* переименуйте файл `Class1.cs` в `Analytics.cs`. Система спросит, переименовать ли все названия в проекте - соглашаемся. В итоге наш класс должен выглядеть так:
 
-![](../img/rider018.png)
-
 ```cs
 namespace CompanyCoreLib
 
@@ -76,11 +88,11 @@ public class Analytics
 }
 ```
 
-Обратите внимание на наличие модификатора **public** у класса - не во всех версиях он ставится автоматически. Добавьте, если его нет.
+Обратите внимание на наличие модификатора **public** у класса - не во всех версиях **Visual Studio** он ставится автоматически. Добавьте, если его нет.
 
 ### Создание метода
 
-В [спецификации](#Спецификация-метода) задано и название метода, его параметры и возвращаемый результат - запишем (не забывая про модификатор доступа **public**):
+В [спецификации](#спецификация-метода) задано и название метода, его параметры и возвращаемый результат - запишем (не забывая про модификатор доступа **public**):
 
 ```cs
 public List<DateTime> PopularMonths(
@@ -124,7 +136,7 @@ foreach (DateTime iterDate in dates) {
 
 <details>
 
-<summary><b>Текст под спойлером устарел! Использовать его можно, но не нужно. Лучше реализовать временный список с использованием кортежей. Это покажет ваше владение средствами языка и уменьшит количество кода/файлов.</b></summary>
+<summary><b>Текст под спойлером устарел! Использовать его можно, но не нужно. Лучше реализовать временный список с использованием **кортежей**. Это покажет ваше владение средствами языка и уменьшит количество кода/файлов.</b></summary>
 
 Теперь нам нужно объявить список объектов, в котором будет хранится дата и количество повторений этой даты. Для этого создадим класс **DateTimeWithCounter** (вообще, по современным гайдлайнам нужно каждый класс писать в отдельном файле и на демо-экзамене помните про это)
 
@@ -178,17 +190,16 @@ public class Analytics
 
 <br/>
 
-**Новый код с использованием кортежей**
-
-Теперь нам нужно объявить список объектов, в котором будет хранится дата и количество повторений этой даты. Для этого используем список [кортежей](https://metanit.com/sharp/tutorial/2.19.php)
+**Новый код с использованием словарей**
 
+Теперь нам нужно объявить словарь, в котором ключём будет дата, а значением - количество повторений этой даты.
 
 ```cs
 public List<DateTime> PopularMonths(
     List<DateTime> dates) 
 {
-    var dateTimeWithCounterList = 
-        new List<Tuple<DateTime, int>>();
+    var dateTimeCounterDictionary = 
+        new Dictionary<DateTime, int>();
 
     int previousYear = DateTime.Now.Year - 1;
     foreach (DateTime iterDate in dates)
@@ -201,6 +212,10 @@ public List<DateTime> PopularMonths(
                 iterDate.Month, // месяц
                 1, 0, 0, 0);    // день
 
+            if (dateTimeCounterDictionary.ContainsKey) {
+
+            }
+
             // ищем эту дату во временном списке
             var index = dateTimeWithCounterList
                 .FindIndex(
@@ -238,7 +253,7 @@ public List<DateTime> PopularMonths(
 }
 ```
 
-Для вычисления начала месяца мы использовали один из конструкторов класса **DateTime(year, month, day, hour, minutes, seconds)**, где год и месяц берем оригинальные, а день равен "1"
+Для вычисления начала месяца мы использовали один из конструкторов класса **DateTime(year, month, day, hour, minutes, seconds)**, где год и месяц берем оригинальные, а день равен `1`
 
 Метод **FindIndex** ищет **позицию** (индекс) элемента в списке. Если элемент в списке есть, то возвращает целое от "0" и выше, а если нет, то "-1".
 
@@ -271,17 +286,17 @@ return dateTimeWithCounterList
 
 В контекстном меню решения добавьте новый проект
 
-![](../img/rider019.png)
+![](../img/test_03.png)
 
-Обратите внимание, тип приложения (Framework или Core) должен совпадать с типом библиотеки
+Обратите внимание, тип приложения (**Framework** или **Core**) должен совпадать с типом библиотеки
 
-![](../img/rider020.png)
+![](../img/test_04.png)
 
 В созданном приложении к контекстном меню "Зависимостей" добавьте ссылку на проект
 
-![](../img/rider021.png)
+![](../img/test_05.png)
 
-![](../img/rider022.png)
+![](../img/test_06.png)
 
 Теперь в коде консольного приложения мы можем использовать класс из библиотеки:
 
@@ -319,8 +334,8 @@ foreach (var date in outDates)
 
 ## Задание
 
-* Реализовать ТЗ, написанное в начале этой лекции. 
-* Составить тестовые сценарии к этой библиотеке используя материалы лекции [Тестовые сценарии, тестовые варианты. Оформление результатов тестирования.](./5_3_1_4_testcase.md). Сценарии оформить в формате MarkDown в файле readme.md в корне "решения".
+* Реализовать библиотеку классов, описанную в этой лекции. 
+* Составить тестовые сценарии к этой библиотеке используя материалы лекции [Тестовые сценарии, тестовые варианты. Оформление результатов тестирования.](./5_3_1_4_testcase.md). Сценарии оформить в формате **MarkDown** в файле `readme.md` в корне "решения".
 
 Предыдущая лекция | &nbsp; | Следующая лекция
 :----------------:|:----------:|:----------------: