diff --git a/ProjectExcavator/ProjectExcavator/CollectionGenericObjects/AbstractCompany.cs b/ProjectExcavator/ProjectExcavator/CollectionGenericObjects/AbstractCompany.cs index da382ce..e6bf78f 100644 --- a/ProjectExcavator/ProjectExcavator/CollectionGenericObjects/AbstractCompany.cs +++ b/ProjectExcavator/ProjectExcavator/CollectionGenericObjects/AbstractCompany.cs @@ -10,7 +10,7 @@ public abstract class AbstractCompany /// /// Размер места (ширина) /// - protected readonly int _placeSizeWidth = 210; + protected readonly int _placeSizeWidth = 195; /// /// Размер места (высота) @@ -35,7 +35,7 @@ public abstract class AbstractCompany /// /// Вычисление максимального количества элементов, которых можно разместить в окне /// - private int GetMaxCount => _pictureWidth * _pictureHeight / (_placeSizeWidth * _placeSizeHeight) + 1; + private int GetMaxCount => _pictureWidth * _pictureHeight / (_placeSizeWidth * _placeSizeHeight); /// /// Конструктор diff --git a/ProjectExcavator/ProjectExcavator/CollectionGenericObjects/ListGenericObjects.cs b/ProjectExcavator/ProjectExcavator/CollectionGenericObjects/ListGenericObjects.cs index 8bb0c67..337767b 100644 --- a/ProjectExcavator/ProjectExcavator/CollectionGenericObjects/ListGenericObjects.cs +++ b/ProjectExcavator/ProjectExcavator/CollectionGenericObjects/ListGenericObjects.cs @@ -1,4 +1,6 @@  +using ProjectExcavator.Exceptions; + namespace ProjectExcavator.CollectionGenericObjects; public class ListGenericObjects : ICollectionGenericObjects @@ -30,44 +32,45 @@ public class ListGenericObjects : ICollectionGenericObjects public T? Get(int position) { - // TODO проверка позиции - if (position < 0 || position > _maxCount) return null; + // проверка позиции + // выброс ошибки, если выход за границы списка + if (position < 0 || position > _maxCount) throw new PositionOutOfCollectionException(position); return _collection[position]; } public int Insert(T obj) { - // TODO проверка, что не превышено максимальное количество элементов + // проверка, что не превышено максимальное количество элементов if (_collection.Count >= _maxCount) { - return -1; + throw new CollectionOverflowException(_maxCount); } - // TODO вставка в конец набора + // вставка в конец набора _collection.Add(obj); - return 0; + return _maxCount; } public int Insert(T obj, int position) { - // TODO проверка, что не превышено максимальное количество элементов + // проверка, что не превышено максимальное количество элементов if (Count >= _maxCount) - return -1; + throw new CollectionOverflowException(_maxCount); - // TODO проверка позиции + // проверка позиции if (position < 0 || position >= _maxCount) - return -1; + throw new PositionOutOfCollectionException(position); - // TODO вставка по позиции + // вставка по позиции _collection.Insert(position, obj); return position; } public T? Remove(int position) { - // TODO проверка позиции - if (position < 0 || position > _maxCount) return null; - // TODO удаление объекта из списка + // проверка позиции + if (position < 0 || position > _maxCount) throw new PositionOutOfCollectionException(position); + // удаление объекта из списка T temp = _collection[position]; _collection[position] = null; return temp; diff --git a/ProjectExcavator/ProjectExcavator/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectExcavator/ProjectExcavator/CollectionGenericObjects/MassiveGenericObjects.cs index cf5d7bc..1949d54 100644 --- a/ProjectExcavator/ProjectExcavator/CollectionGenericObjects/MassiveGenericObjects.cs +++ b/ProjectExcavator/ProjectExcavator/CollectionGenericObjects/MassiveGenericObjects.cs @@ -1,4 +1,6 @@  +using ProjectExcavator.Exceptions; + namespace ProjectExcavator.CollectionGenericObjects; /// @@ -50,17 +52,17 @@ public class MassiveGenericObjects : ICollectionGenericObjects public T? Get(int position) { - // TODO проверка позиции + // проверка позиции if (position >= _collection.Length || position < 0) { - return null; + throw new PositionOutOfCollectionException(position); } return _collection[position]; } public int Insert(T obj) { - // TODO вставка в свободное место набора + // вставка в свободное место набора int index = 0; while (index < _collection.Length) { @@ -71,20 +73,16 @@ public class MassiveGenericObjects : ICollectionGenericObjects } index++; } - return -1; + throw new CollectionOverflowException(Count); } public int Insert(T obj, int position) { - // TODO проверка позиции - // TODO проверка, что элемент массива по этой позиции пустой, если нет, то - // ищется свободное место после этой позиции и идет вставка туда - // если нет после, ищем до - // TODO вставка + // проверка позиции if (position >= _collection.Length || position < 0) - return -1; + throw new PositionOutOfCollectionException(position); - // TODO проверка, что элемент массива по этой позиции пустой, если нет, то + // проверка, что элемент массива по этой позиции пустой, если нет, то if (_collection[position] != null) { // проверка, что после вставляемого элемента в массиве есть пустой элемент @@ -109,19 +107,24 @@ public class MassiveGenericObjects : ICollectionGenericObjects _collection[j + 1] = _collection[j]; j--; } + throw new CollectionOverflowException(Count); } - // TODO вставка по позиции + // вставка по позиции _collection[position] = obj; return position; } public T? Remove(int position) { - // TODO проверка позиции - // TODO удаление объекта из массива, присвоив элементу массива значение null + // проверка позиции + // удаление объекта из массива, присвоив элементу массива значение null if (position >= _collection.Length || position < 0) { - return null; + throw new PositionOutOfCollectionException(position); + } + if (_collection[position] == null) + { + throw new ObjectNotFoundException(position); } T temp = _collection[position]; _collection[position] = null; diff --git a/ProjectExcavator/ProjectExcavator/CollectionGenericObjects/StorageCollection.cs b/ProjectExcavator/ProjectExcavator/CollectionGenericObjects/StorageCollection.cs index 8ad5434..fa095bb 100644 --- a/ProjectExcavator/ProjectExcavator/CollectionGenericObjects/StorageCollection.cs +++ b/ProjectExcavator/ProjectExcavator/CollectionGenericObjects/StorageCollection.cs @@ -1,5 +1,5 @@ using ProjectExcavator.Drawnings; -using System.Text; +using ProjectExcavator.Exceptions; namespace ProjectExcavator.CollectionGenericObjects; @@ -50,12 +50,12 @@ public class StorageCollection /// Тип коллекции public void AddCollection(string name, CollectionType collectionType) { - // TODO проверка, что name не пустой и нет в словаре записи с таким ключом + // проверка, что name не пустой и нет в словаре записи с таким ключом if (string.IsNullOrEmpty(name) || _storages.ContainsKey(name)) { return; } - // TODO прописать логику для добавления + // прописать логику для добавления if (collectionType == CollectionType.List) { _storages.Add(name, new ListGenericObjects()); @@ -72,7 +72,7 @@ public class StorageCollection /// Название коллекции public void DelCollection(string name) { - // TODO прописать логику для удаления коллекции + // прописать логику для удаления коллекции if (!_storages.ContainsKey(name)) return; _storages.Remove(name); } @@ -86,7 +86,7 @@ public class StorageCollection { get { - // TODO продумать логику получения объекта + // продумать логику получения объекта if (_storages.ContainsKey((string)name)) { return _storages[name]; @@ -99,12 +99,11 @@ public class StorageCollection /// Сохранение информации по автомобилям в хранилище в файл /// /// Путь и имя файла - /// true - сохранение прошло успешно, false - ошибка при сохранении данных - public bool SaveData(string filename) + public void SaveData(string filename) { if (_storages.Count == 0) { - return false; + throw new Exception("В хранилище отсутствуют коллекции для сохранения"); } if (File.Exists(filename)) @@ -144,7 +143,6 @@ public class StorageCollection } } } - return true; } /// @@ -152,11 +150,11 @@ public class StorageCollection /// /// Путь и имя файла /// true - загрузка прошла успешно, false - ошибка при загрузке данных - public bool LoadData(string filename) + public void LoadData(string filename) { if (!File.Exists(filename)) { - return false; + throw new Exception("Файл не существует"); } using (StreamReader reader = File.OpenText(filename)) @@ -165,13 +163,12 @@ public class StorageCollection if (str == null || str.Length == 0) { - return false; + throw new Exception("В файле нет данных"); } if (!str.StartsWith(_collectionKey)) { - //если нет такой записи, то это не те данные - return false; + throw new Exception("В файле неверные данные"); } _storages.Clear(); @@ -188,7 +185,7 @@ public class StorageCollection ICollectionGenericObjects? collection = StorageCollection.CreateCollection(collectionType); if (collection == null) { - return false; + throw new Exception("Не удалось создать коллекцию"); } collection.MaxCount = Convert.ToInt32(record[2]); @@ -198,9 +195,16 @@ public class StorageCollection { if (elem?.CreateDrawningBulldozer() is T bulldozer) { - if (collection.Insert(bulldozer) == -1) + try { - return false; + if (collection.Insert(bulldozer) == -1) + { + throw new Exception("Объект не удалось добавить в коллекцию: " + record[3]); + } + } + catch (CollectionOverflowException ex) + { + throw new Exception("Коллекция переполнена", ex); } } } @@ -208,7 +212,6 @@ public class StorageCollection _storages.Add(record[0], collection); } } - return true; } /// diff --git a/ProjectExcavator/ProjectExcavator/Exceptions/CollectionOverflowException.cs b/ProjectExcavator/ProjectExcavator/Exceptions/CollectionOverflowException.cs new file mode 100644 index 0000000..90379d3 --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/Exceptions/CollectionOverflowException.cs @@ -0,0 +1,16 @@ +using System.Runtime.Serialization; + +namespace ProjectExcavator.Exceptions; + +/// +/// Класс, описывающий ошибку переполнения коллекции +/// +[Serializable] +internal class CollectionOverflowException : ApplicationException +{ + public CollectionOverflowException(int count) : base("В коллекции превышено допустимое количество: " + count) { } + public CollectionOverflowException() : base() { } + public CollectionOverflowException(string message) : base(message) { } + public CollectionOverflowException(string message, Exception exception) : base(message, exception) { } + protected CollectionOverflowException(SerializationInfo info, StreamingContext context) : base(info, context) { } +} diff --git a/ProjectExcavator/ProjectExcavator/Exceptions/ObjectNotFoundException.cs b/ProjectExcavator/ProjectExcavator/Exceptions/ObjectNotFoundException.cs new file mode 100644 index 0000000..88029bc --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/Exceptions/ObjectNotFoundException.cs @@ -0,0 +1,16 @@ +using System.Runtime.Serialization; + +namespace ProjectExcavator.Exceptions; + +/// +/// Класс, описывающий ошибку, что по указанной позиции нет элемента +/// +[Serializable] +internal class ObjectNotFoundException : ApplicationException +{ + public ObjectNotFoundException(int i) : base("Не найден объект по позиции " + i) { } + public ObjectNotFoundException() : base() { } + public ObjectNotFoundException(string message) : base(message) { } + public ObjectNotFoundException(string message, Exception exception) : base(message, exception) { } + protected ObjectNotFoundException(SerializationInfo info, StreamingContext context) : base(info, context) { } +} diff --git a/ProjectExcavator/ProjectExcavator/Exceptions/PositionOutOfCollectionException.cs b/ProjectExcavator/ProjectExcavator/Exceptions/PositionOutOfCollectionException.cs new file mode 100644 index 0000000..f520eb4 --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/Exceptions/PositionOutOfCollectionException.cs @@ -0,0 +1,13 @@ +using System.Runtime.Serialization; + +namespace ProjectExcavator.Exceptions; + +[Serializable] +internal class PositionOutOfCollectionException : ApplicationException +{ + public PositionOutOfCollectionException(int i) : base("Выход за границы коллекции. Позиция " + i) { } + public PositionOutOfCollectionException() : base() { } + public PositionOutOfCollectionException(string message) : base(message) { } + public PositionOutOfCollectionException(string message, Exception exception) : base(message, exception) { } + protected PositionOutOfCollectionException(SerializationInfo info, StreamingContext context) : base(info, context) { } +} diff --git a/ProjectExcavator/ProjectExcavator/FormBulldozerCollection.cs b/ProjectExcavator/ProjectExcavator/FormBulldozerCollection.cs index 7ce8fa1..5cfbb70 100644 --- a/ProjectExcavator/ProjectExcavator/FormBulldozerCollection.cs +++ b/ProjectExcavator/ProjectExcavator/FormBulldozerCollection.cs @@ -1,5 +1,7 @@ -using ProjectExcavator.CollectionGenericObjects; +using Microsoft.Extensions.Logging; +using ProjectExcavator.CollectionGenericObjects; using ProjectExcavator.Drawnings; +using ProjectExcavator.Exceptions; namespace ProjectExcavator; @@ -18,13 +20,19 @@ public partial class FormBulldozerCollection : Form /// private AbstractCompany? _company = null; + /// + /// Логер + /// + private readonly ILogger _logger; + /// /// Конструктор /// - public FormBulldozerCollection() + public FormBulldozerCollection(ILogger logger) { InitializeComponent(); _storageCollection = new(); + _logger = logger; } /// @@ -60,15 +68,19 @@ public partial class FormBulldozerCollection : Form { return; } - - if (_company + bulldozer != -1) + try { - MessageBox.Show("Объект добавлен"); - pictureBox.Image = _company.Show(); + if (_company + bulldozer != -1) + { + MessageBox.Show("Объект добавлен"); + pictureBox.Image = _company.Show(); + _logger.LogInformation("Добавлен объект: {object}", bulldozer.GetDataForSave()); + } } - else + catch (CollectionOverflowException ex) { - MessageBox.Show("Не удалось добавить объект"); + MessageBox.Show(ex.Message); + _logger.LogError("Ошибка: {Message}", ex.Message); } } @@ -85,14 +97,19 @@ public partial class FormBulldozerCollection : Form } int pos = Convert.ToInt32(maskedTextBoxPosition.Text); - if (_company - pos != null) + try { - MessageBox.Show("Объект удален"); - pictureBox.Image = _company.Show(); + if (_company - pos != null) + { + MessageBox.Show("Объект удален"); + pictureBox.Image = _company.Show(); + _logger.LogInformation("Удален объект по позиции " + pos); + } } - else + catch (ObjectNotFoundException ex) { - MessageBox.Show("Не удалось удалить объект"); + MessageBox.Show(ex.Message); + _logger.LogError("Ошибка: {Message}", ex.Message); } } @@ -105,26 +122,33 @@ public partial class FormBulldozerCollection : Form DrawningBulldozer? bulldozer = null; int counter = 100; - while (bulldozer == null) + try { - bulldozer = _company.GetRandomObject(); - counter--; - if (counter <= 0) + while (bulldozer == null) { - break; + bulldozer = _company.GetRandomObject(); + counter--; + if (counter <= 0) + { + break; + } } - } - if (bulldozer == null) - { - return; - } + if (bulldozer == null) + { + return; + } - FormExcavator form = new() + FormExcavator form = new() + { + SetBulldozer = bulldozer + }; + form.ShowDialog(); + } + catch (Exception ex) { - SetBulldozer = bulldozer - }; - form.ShowDialog(); + MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + } } private void ButtonRefresh_Click(object sender, EventArgs e) @@ -163,6 +187,7 @@ public partial class FormBulldozerCollection : Form _storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); RefreshListBoxItems(); + _logger.LogInformation("Добавлена коллекция: {collectionName} типа: {collectionType}", textBoxCollectionName.Text, collectionType); } /// @@ -199,6 +224,7 @@ public partial class FormBulldozerCollection : Form // удалить и обновить ListBox _storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString() ?? string.Empty); RefreshListBoxItems(); + _logger.LogInformation("Удалена коллекция: {collectionName} ", textBoxCollectionName.Text); } /// @@ -246,6 +272,7 @@ public partial class FormBulldozerCollection : Form panelCompanyTools.Enabled = true; RefreshListBoxItems(); + _logger.LogInformation("Создана компания на коллекции: {collectionName} ", textBoxCollectionName.Text); } /// @@ -257,13 +284,16 @@ public partial class FormBulldozerCollection : Form { if (saveFileDialog.ShowDialog() == DialogResult.OK) { - if (_storageCollection.SaveData(saveFileDialog.FileName)) + try { + _storageCollection.SaveData(saveFileDialog.FileName); MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogInformation("Сохранение в файл: {filename}", saveFileDialog.FileName); } - else + catch(Exception ex) { - MessageBox.Show("Не сохранилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("Ошибка: {Message}", ex.Message); } } } @@ -277,15 +307,17 @@ public partial class FormBulldozerCollection : Form { if (openFileDialog.ShowDialog() == DialogResult.OK) { - if (_storageCollection.LoadData(openFileDialog.FileName)) + try { + _storageCollection.LoadData(openFileDialog.FileName); MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); - RefreshListBoxItems(); + _logger.LogInformation("Загрузка из файла: {filename}", openFileDialog.FileName); } - else + catch(Exception ex) { - MessageBox.Show("Не загрузилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("Ошибка: {Message}", ex.Message); } } } diff --git a/ProjectExcavator/ProjectExcavator/Program.cs b/ProjectExcavator/ProjectExcavator/Program.cs index 90b02e5..9cdfe6c 100644 --- a/ProjectExcavator/ProjectExcavator/Program.cs +++ b/ProjectExcavator/ProjectExcavator/Program.cs @@ -1,3 +1,8 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Configuration; +using Serilog; + namespace ProjectExcavator { internal static class Program @@ -11,7 +16,35 @@ namespace ProjectExcavator // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new FormBulldozerCollection()); + + ServiceCollection services = new(); + ConfigureServices(services); + using ServiceProvider serviceProvider = services.BuildServiceProvider(); + Application.Run(serviceProvider.GetRequiredService()); + } + + /// + /// DI + /// + /// + private static void ConfigureServices(ServiceCollection services) + { + string[] path = Directory.GetCurrentDirectory().Split('\\'); + string pathNeed = ""; + for (int i = 0; i < path.Length - 3; i++) + { + pathNeed += path[i] + "\\"; + } + services.AddSingleton() + .AddLogging(option => + { + option.SetMinimumLevel(LogLevel.Information); + option.AddSerilog(new LoggerConfiguration() + .ReadFrom.Configuration(new ConfigurationBuilder() + .AddJsonFile($"{pathNeed}serilog.json") + .Build()) + .CreateLogger()); + }); } } } \ No newline at end of file diff --git a/ProjectExcavator/ProjectExcavator/ProjectExcavator.csproj b/ProjectExcavator/ProjectExcavator/ProjectExcavator.csproj index 629ec08..2788a02 100644 --- a/ProjectExcavator/ProjectExcavator/ProjectExcavator.csproj +++ b/ProjectExcavator/ProjectExcavator/ProjectExcavator.csproj @@ -8,6 +8,19 @@ enable + + + + + + + + + + + + + True @@ -23,4 +36,10 @@ + + + Always + + + \ No newline at end of file diff --git a/ProjectExcavator/ProjectExcavator/nlog.config b/ProjectExcavator/ProjectExcavator/nlog.config new file mode 100644 index 0000000..b352afc --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/nlog.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/ProjectExcavator/ProjectExcavator/serilog.json b/ProjectExcavator/ProjectExcavator/serilog.json new file mode 100644 index 0000000..a7878e1 --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/serilog.json @@ -0,0 +1,15 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Debug", + "WriteTo": [ + { + "Name": "File", + "Args": { "path": "log.log" } + } + ], + "Properties": { + "Application": "Sample" + } + } +}