PIbd-22_Petrushin_E.A._Lab7 #12

Closed
Egor_Petrushin wants to merge 3 commits from PIbd-22_Petrushin_E.A._Lab7 into PIbd-22_Petrushin_E.A._Lab6
10 changed files with 190 additions and 51 deletions

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace SelfPropelledArtilleryUnit
{
[Serializable]
internal class AddToCollectionException : ApplicationException
{
public AddToCollectionException() : base() { }
public AddToCollectionException(string message) : base(message) { }
public AddToCollectionException(string message, Exception exception) : base(message, exception) { }
protected AddToCollectionException(SerializationInfo info, StreamingContext contex) : base(info, contex) { }
}
}

View File

@ -1,12 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SelfPropelledArtilleryUnit
{
internal class Extention
{
}
}

View File

@ -7,10 +7,14 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Extensions.Logging;
using SelfPropelledArtilleryUnit.DrawningObjects;
using SelfPropelledArtilleryUnit.MovementStrategy;
using SelfPropelledArtilleryUnit.Generics;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using Serilog;
using System.Xml.Linq;
using ILogger = Serilog.ILogger;
namespace SelfPropelledArtilleryUnit
{
@ -19,18 +23,23 @@ namespace SelfPropelledArtilleryUnit
/// </summary>
public partial class FormSPAUCollection : Form
{
readonly int countPlaces = 11;
readonly int countPlaces = 12;
/// <summary>
/// Набор объектов
/// </summary>
private readonly SPAUGenericStorage _storage;
/// <summary>
/// Логер
/// </summary>
private readonly ILogger<FormSPAUCollection> _logger;
/// <summary>
/// Конструктор
/// </summary>
public FormSPAUCollection()
public FormSPAUCollection(ILogger<FormSPAUCollection> logger)
{
InitializeComponent();
_storage = new SPAUGenericStorage(pictureBoxCollection.Width, pictureBoxCollection.Height);
_logger = logger;
}
/// <summary>
/// Заполнение listBoxObjects
@ -64,10 +73,12 @@ namespace SelfPropelledArtilleryUnit
if (string.IsNullOrEmpty(textBoxStorageName.Text))
{
MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
_logger.LogWarning("Попытка добавить набор с пустым именем");
return;
}
_storage.AddSet(textBoxStorageName.Text);
ReloadObjects();
_logger.LogInformation($"Добавлен набор: {textBoxStorageName.Text}");
}
/// <summary>
@ -90,12 +101,15 @@ namespace SelfPropelledArtilleryUnit
{
if (listBoxStorages.SelectedIndex == -1)
{
_logger.LogWarning("Коллекция не выбрана");
return;
}
string name = listBoxStorages.SelectedItem.ToString() ?? string.Empty;
if (MessageBox.Show($"Удалить объект {listBoxStorages.SelectedItem}?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
_storage.DelSet(listBoxStorages.SelectedItem.ToString() ?? string.Empty);
_storage.DelSet(name);
ReloadObjects();
_logger.LogInformation($"Удален набор: {name}");
}
}
/// <summary>
@ -108,6 +122,7 @@ namespace SelfPropelledArtilleryUnit
if (listBoxStorages.SelectedIndex == -1)
{
_logger.LogWarning("Коллекция не выбрана");
return;
}
var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty];
@ -125,6 +140,7 @@ namespace SelfPropelledArtilleryUnit
{
if (listBoxStorages.SelectedIndex == -1)
{
_logger.LogWarning("Коллекция не выбрана");
return;
}
var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty];
@ -133,16 +149,27 @@ namespace SelfPropelledArtilleryUnit
return;
}
int addedIndex = obj + sPAU;
if (addedIndex != -1 && addedIndex <= countPlaces)
try
{
MessageBox.Show("Объект добавлен");
pictureBoxCollection.Image = obj.ShowSPAUs();
int addedIndex = obj + sPAU;
if (addedIndex != -1 && addedIndex <= countPlaces)
{
MessageBox.Show("Объект добавлен");
pictureBoxCollection.Image = obj.ShowSPAUs();
_logger.LogInformation("Объект добавлен");
}
else
{
MessageBox.Show("Не удалось добавить объект");
_logger.LogWarning("Неудачная попытка добавления");
}
}
else
catch (Exception ex)
{
MessageBox.Show("Не удалось добавить объект");
_logger.LogWarning($"Неудачная попытка добавления: {ex}");
}
}
@ -173,19 +200,31 @@ namespace SelfPropelledArtilleryUnit
pos = Convert.ToInt32(maskedTextBoxNumber.Text);
}
catch
catch(Exception ex)
{
MessageBox.Show("Не удалось удалить объект");
_logger.LogWarning($"Неудачная попытка удаления: {ex}");
return;
}
if (obj - pos)
try
{
MessageBox.Show("Объект удален");
pictureBoxCollection.Image = obj.ShowSPAUs();
if (obj - pos)
{
MessageBox.Show("Объект удален");
pictureBoxCollection.Image = obj.ShowSPAUs();
_logger.LogInformation("Объект удален");
}
else
{
MessageBox.Show("Не удалось удалить объект");
_logger.LogWarning($"Неудачная попытка удаления c позиции {pos}");
}
}
else
catch(SPAUNotFoundException ex)
{
MessageBox.Show("Не удалось удалить объект");
MessageBox.Show(ex.Message);
_logger.LogWarning($"Неудачная попытка удаления: {ex}");
}
}
/// <summary>
@ -216,15 +255,17 @@ namespace SelfPropelledArtilleryUnit
{
if (saveFileDialog_.ShowDialog() == DialogResult.OK)
{
if (_storage.SaveData(saveFileDialog_.FileName))
try
{
MessageBox.Show("Сохранение прошло успешно",
"Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
_storage.SaveData(saveFileDialog_.FileName);
MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
_logger.LogInformation("Успешное сохранение");
}
else
catch(Exception ex)
{
MessageBox.Show("Не сохранилось", "Результат",
MessageBoxButtons.OK, MessageBoxIcon.Error);
MessageBox.Show($"Не сохранилось: {ex.Message}", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error);
_logger.LogWarning($"Не сохранилось: {ex.Message}");
}
}
}
@ -240,12 +281,13 @@ namespace SelfPropelledArtilleryUnit
if (_storage.LoadData(openFileDialog_.FileName))
{
MessageBox.Show("Загрузка прошлa успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
_logger.LogInformation("Успешная загрузка");
ReloadObjects();
}
else
{
MessageBox.Show("Не загрузилось", "Результат",
MessageBoxButtons.OK, MessageBoxIcon.Error);
MessageBox.Show("Не загрузилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error);
_logger.LogWarning("Неудачная попытка загрузки");
}
}
}

View File

@ -1,3 +1,9 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
using Serilog;
using System.Drawing;
using ILogger = Serilog.ILogger;
namespace SelfPropelledArtilleryUnit
{
internal static class Program
@ -9,8 +15,27 @@ namespace SelfPropelledArtilleryUnit
static void Main()
{
ApplicationConfiguration.Initialize();
Application.Run(new FormSPAUCollection());
//Application.Run(new FormSPAU());
var services = new ServiceCollection();
ConfigureServices(services);
using (ServiceProvider serviceProvider = services.BuildServiceProvider())
{
Application.Run(serviceProvider.GetRequiredService<FormSPAUCollection>());
}
}
private static void ConfigureServices(ServiceCollection services)
{
string currentTime = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss");
string logFileName = $"logs/spaulog-{currentTime}.txt";
services.AddSingleton<FormSPAUCollection>().AddLogging(option =>
Review

Настройку логера следует выносить в отдельный конфигурационный файл, чтобы ее можно было менять без пересборки проекта

Настройку логера следует выносить в отдельный конфигурационный файл, чтобы ее можно было менять без пересборки проекта
{
option.SetMinimumLevel(LogLevel.Information);
option.AddSerilog(new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.File(logFileName)
.CreateLogger());
});
}
}
}

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace SelfPropelledArtilleryUnit
{
[Serializable]
internal class ReadFileExeption : ApplicationException
Review

Не требовалось делать

Не требовалось делать
{
public ReadFileExeption() : base() { }
public ReadFileExeption(string message) : base(message) { }
public ReadFileExeption(string message, Exception exception) : base(message, exception) { }
protected ReadFileExeption(SerializationInfo info, StreamingContext contex) : base(info, contex) { }
}
}

View File

@ -116,7 +116,7 @@ namespace SelfPropelledArtilleryUnit.Generics
}
if (data.Length == 0)
{
return false;
throw new ReadFileExeption("Невалиданя операция, нет данных для сохранения");
Review

Требовалось заменить класс Exception на его более подходящих наследников (стандартных, а не своих)

Требовалось заменить класс Exception на его более подходящих наследников (стандартных, а не своих)
}
using (StreamWriter writer = new StreamWriter(filename))
{
@ -142,11 +142,12 @@ namespace SelfPropelledArtilleryUnit.Generics
string str = fs.ReadLine();
if (str == null || str.Length == 0)
{
return false;
throw new ReadFileExeption("Нет данных для загрузки");
}
if (!str.StartsWith("SPAUStorage"))
{
return false;
//если нет такой записи, то это не те данные
throw new ReadFileExeption("Неверный формат данных");
}
_SPAUStorages.Clear();
@ -156,7 +157,7 @@ namespace SelfPropelledArtilleryUnit.Generics
{
if (strs == null)
{
return false;
throw new AddToCollectionException("Ошибка добавления в коллекцию");
}
string[] record = strs.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries);
@ -173,7 +174,7 @@ namespace SelfPropelledArtilleryUnit.Generics
{
if ((collection + sPAU) == -1)
{
return false;
throw new AddToCollectionException("Ошибка добавления в коллекцию");
}
}
}

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace SelfPropelledArtilleryUnit
{
[Serializable]
internal class SPAUNotFoundException : ApplicationException
Review

Не требовалось делать

Не требовалось делать
{
public SPAUNotFoundException(int i) : base($"Не найден объект попозиции { i}") { }
public SPAUNotFoundException() : base() { }
public SPAUNotFoundException(string message) : base(message) { }
public SPAUNotFoundException(string message, Exception exception) : base(message, exception) { }
protected SPAUNotFoundException(SerializationInfo info, StreamingContext contex) : base(info, contex) { }
}
}

View File

@ -8,6 +8,13 @@
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.3.5" />
<PackageReference Include="Serilog" Version="3.1.1" />
<PackageReference Include="Serilog.AspNetCore" Version="3.4.0" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>

View File

@ -55,13 +55,14 @@ namespace SelfPropelledArtilleryUnit.Generics
public int Insert(T spau, int position)
{
if (Count == _maxCount)
return -1;
throw new StorageOverflowException(Count);
if (position < 0 || spau == null)
return -1;
if (position >= _maxCount)
return -1;
if (spau == null)
throw new SPAUNotFoundException("Вставка невоможна, объект не найден");
if (position < 0 || position > _maxCount)
throw new SPAUNotFoundException(position);
if (Count == 0)
@ -81,9 +82,8 @@ namespace SelfPropelledArtilleryUnit.Generics
/// <returns></returns>
public bool Remove(int position)
{
if (position < 0 || position >= Count)
return false;
if (_places[position] == null)
throw new SPAUNotFoundException(position);
_places.RemoveAt(position);
return true;
@ -97,13 +97,13 @@ namespace SelfPropelledArtilleryUnit.Generics
{
get
{
if (position < 0 || position >= _maxCount)
if (position < 0 || position >= Count)
return null;
return _places[position];
}
set
{
if (position < 0 || position >= _maxCount)
if (position < 0 || position > _maxCount)
return;
_places[position] = value;
}

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace SelfPropelledArtilleryUnit
{
[Serializable]
internal class StorageOverflowException : ApplicationException
{
public StorageOverflowException(int count) : base($"В наборе превышено допустимое количество: {count}") { }
public StorageOverflowException() : base() { }
public StorageOverflowException(string message) : base(message) { }
public StorageOverflowException(string message, Exception exception) : base(message, exception) { }
protected StorageOverflowException(SerializationInfo info, StreamingContext contex) : base(info, contex) { }
}
}