Refaktoryzacja kodu

0

Witam,
Mam problem. Pewnie błahy dla większości, ale jednak. Zostałem poproszony o refaktoryzację kodu. Część nieodpowiedzialna za działania na widoku ma być odseparowana od tej, która na widoku operuje. Tutaj przykładowa klasa. Np funkcje: GetEventScan(), GetHistory(), GetOperatDetail() czy GetNormativePage() nie operują na żadnej kontrolce, a jedynie na danych przekazanych do tej klasy w konstruktorze. Jakaś propozycja jak to podzielić?

using A0Scann.Model;
using A0Scann.SQL;
using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

namespace A0Scann
{
    public partial class FilePathChanged : Form
    {
        public string pathTranche;
        private string scannerName;
        private string filePath;
        private string schema;
        private static double szerA4 = 21, wysA4 = 29.7, cal = 2.54;
        private int imageHeight;
        private int imageWidth;
        private int imageDpi;
        private int imageSize;
        private int idOrder;
        private int idTranche;
        private int userId;
        private double iloscStronA4;
        private OperatDetail OperatDetail;

        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);


        public FilePathChanged(string schema, OperatDetail operatDetail, string pathTranche, string scannerName, int userId, int OrderId, int trancheId)
        {
            this.schema = schema;
            OperatDetail = operatDetail;
            this.pathTranche = pathTranche;
            this.scannerName = scannerName;
            this.userId = userId;
            idOrder = OrderId;
            idTranche = trancheId;
            InitializeComponent();
        }

        private void FilePathChanged_Load(object sender, EventArgs e)
        {
            filePath = ChangePath();
            textBoxFilePath.Text = filePath;
            Clipboard.SetText(filePath);
            Directory.CreateDirectory(filePath.Replace($"mapa{OperatDetail.PageNumber.ToString("0000")}.tif", ""));
            log.Info("Zamiana ścieżki na zgodną ze wzorcem");
        }

        public string ChangePath()
        {
            return pathTranche
                .Replace("SKANER", scannerName)
                .Replace("DATA", DateTime.Now.ToString("yyyyMMdd"))
                .Replace("IEMZ", OperatDetail.Operat.Iemz)//P.1111.2222.4444
                .Replace("img####", $"mapa{OperatDetail.PageNumber.ToString("0000")}.tif");
        }

        private void FilePathChanged_FormClosed(object sender, FormClosedEventArgs e)
        {
            (this.Owner as HeadWindow).buttonScannMap.Enabled = true;
            (this.Owner as HeadWindow).dataGridView1.Enabled = true;
          //  (this.Owner as HeadWindow).dataGridView1.Rows.Clear();
           // (this.Owner as HeadWindow).dataGridView1.Refresh();
            (this.Owner as HeadWindow).GetListOperatDetailsAndInsertToDGV(); // pobierz na nowo liste map i wyswietl
            log.Info("Zamknieto formularz skanowania map");
        }

        private void ButtonReturn_Click(object sender, EventArgs e)
        {
            (this.Owner as HeadWindow).buttonScannMap.Enabled = true;
            (this.Owner as HeadWindow).dataGridView1.Enabled = true;
          //  (this.Owner as HeadWindow).dataGridView1.Rows.Clear(); // czyści tabele
           // (this.Owner as HeadWindow).dataGridView1.Refresh(); // odświeża ją
            log.Info("Zamknieto formularz skanowania map");
            this.Close(); //
        }

        private void ButtonScannedMap_Click(object sender, EventArgs e)
        {
            OperatDetailsSql operatDetailsSql = new OperatDetailsSql();
            if (File.Exists(filePath)) // jeżeli plik o podanej ściezce istnieje
            {
                DialogResult result = MessageBox.Show("Czy napewno chcesz oznaczyć zaznaczoną mapę jako zeskanowaną?", "Potwierdzenie", MessageBoxButtons.YesNo);
                if (result == DialogResult.Yes) // jezeli uzytkownik potwierdzil chęć zeskanowania
                {
                    GetNormativePage();

                    OperatDetail operatDetail = GetOperatDetail();
                    History newHistory = GetHistory();
                    EventScan eventScan = GetEventScan();

                    try
                    {
                        operatDetailsSql.AddOperatDetailWithHistoryAndEventScan(schema, operatDetail, eventScan, newHistory, OperatDetail);
                        log.Info("Utworzono wpis dla tabel operat szczegoly, historia i zdarzenia skanowania");

                        //  LocalSqliteUtils sqliteUtils = new LocalSqliteUtils();
                        //  sqliteUtils.AddToModel(operatDetail.Id, idOrder, idTranche, DateTime.Now, DateTime.Today, "Nieprzeniesiony", operatDetail.FilePath);
                        (this.Owner as HeadWindow).textBox1.Text = "";
                        this.Close();
                    }
                    catch (Exception ex)
                    {
                        log.Error($"Błąd w dodaniu wpisów do tabel operat szczegoly, historia i zdarzenia skanowania lub modelu");
                        log.Error(ex.StackTrace);
                    }
                }
                else
                {
                    MessageBox.Show("Anulowano", "Uwaga");
                }
            }
            else
            {
                log.Info($"Plik o podanej {filePath} nie istnieje!");
                MessageBox.Show("Plik o podanej ścieżce nie istnieje. \n Najprawdopodobniej nie został zeskanowany!", "Błąd");
            }
        }

        private void GetNormativePage()
        {
            try
            {
                using (FileStream fileStram = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                {
                    using (Image imag = Image.FromStream(fileStram, false, false))
                    {
                        imageWidth = (int)imag.PhysicalDimension.Width; // pobranie szerokosci w pikselach
                        imageHeight = (int)imag.PhysicalDimension.Height; // pobranie wysokosci w pikselach
                        imageDpi = (int)imag.HorizontalResolution; // pobranie rozdzielczosci 
                        imageSize = (int)new FileInfo(filePath).Length; // pobranie rozmiaru obrazu

                        double wysokoscInCm = (imageHeight / imageDpi) * cal; // wysokosc kartki w cm
                        double szerokoscInCm = (imageWidth / imageDpi) * cal; // szerokosc kartki w cm

                        double poleInCm = (wysokoscInCm * szerokoscInCm); // pole kartki w cm^2
                        double poleA4 = (szerA4 * wysA4); // pole wzorca A4

                        double countA4 = (poleInCm / poleA4); // Math.Ceiling(poleInCm / poleA4); - ceiling zawsze zaokrągla do jedności w góre!!!
                        iloscStronA4 = 0;

                        if (countA4 > 0 && countA4 < 1) // mniejsze od A4
                        {
                            iloscStronA4 = 1;
                        }
                        else
                        {
                            iloscStronA4 = Math.Round(countA4, MidpointRounding.AwayFromZero); // zaokragla do 0.4 w dol, a od 0.5 w gore
                        }
                    }
                }
            }
            catch (Exception e)
            {
                log.Error($"Błąd w odczycie pliku {filePath}");
            }
        }

        private OperatDetail GetOperatDetail()
        {
            OperatDetail operatDetail = new OperatDetail
            {
                FilePath = filePath,
                OperatId = OperatDetail.OperatId,
                PageNumber = OperatDetail.PageNumber,
                ScanTime = DateTime.Now,
                IsRemove = false,
                IsDelete = "",
                Type = "Mapa",
                Width = imageWidth,
                Height = imageHeight,
                NormativeA4 = (int)iloscStronA4,
                Date = DateTime.Now,
                Resolution = imageDpi,
                Size = imageSize
            };
            log.Info("Utworzono obiekt dla tabeli operat szczegoly");
            return operatDetail;
        }

        private History GetHistory()
        {
            History newHistory = new History
            {
                CreateDate = DateTime.Now,
                Description = "Utworzenie pliku",
                Date = DateTime.Today.Date,
                EventTypeId = 39,
                IsRemove = false,
                OperatId = OperatDetail.OperatId,
                OperatorId = userId,
                Time = DateTime.Now,
                OperatStatusId = 1
            };
            log.Info("Utworzono obiekt dla tabeli historia");
            return newHistory;
        }

        private EventScan GetEventScan()
        {
            EventScan eventScan = new EventScan
            {
                CorrectPagesCount = 1,
                EmptyPagesCount = 0,
                EndTime = DateTime.Now,
                OperatId = OperatDetail.OperatId,
                OperatorId = userId,
                ScannerName = scannerName,
                ScanType = "A0",
                StartTime = DateTime.Now,
                TotalPagesCount = 1
            };
            log.Info("Utworzono obiekt dla tabeli zdarzenia skanowania");
            return eventScan;
        }

    }
}

0

dopoki nie bedzie kontekstu po co istnieje ta klasa i jakie ma odpowiedzialnosci (bo w tej chwili jest wiecej niz jedna) to nie ma sensu sie zabierac za rekfaktoryzacje

Oczywista zmiana jest DRY, SOLID, KISS czyli jezeli masz 10 property. To stworz jedna klase POCO ktora bedzie trzymac dane w sobie

GetEventScan(), GetHistory to sa proste buildery

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.