La classe ItemManager ha troppe responsabilità (caricare elementi, fornire elementi, ha un riferimento a ItemsList)

0

Quindi la mia classe manager fa 2 cose, carica elementi da file e da un articolo a un thread che lo richiede, contiene anche l'elenco che conterrà tutti gli elementi.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace Bot.Core.MainEntryPoint
{
    class ItemManager
    {
        private static List<string> ItemsList = new List<string>();
        private static int Pos = 0;
        private static object LockObject = new object(); // multiple threads would be accessing this at the same time

    public static void LoadFromFile()
    {
        ItemsList = File.ReadAllLines("PATH TO FILE").ToList();
    }

    public static string GetOneItem()
    {
        string result = "";

        if (List.Count > 0)
        {
            lock (LockObject)
            {
                if (Pos > ItemsList.Count - 1)
                {
                    Pos = 0;
                }

                result = ItemsList[Pos];

                Pos++;
            }
        }

        return result;
    }
}
}

Ora secondo me questo viola il principio della singola responsabilità e non allo stesso tempo (sembra essere relativo a chi lo usa)

Ho provato ad avere una classe ItemLoader, una classe ItemGiver, ma poi non riesco a capire da dove caricare o recuperare gli elementi, che "ItemsList" deve essere da qualche parte.

    
posta Joao Vitor 01.11.2017 - 18:07
fonte

1 risposta

1

OK. Quindi ci sono una serie di (potenziali) problemi con questa classe. Ma sì, sono d'accordo che non dovrebbe caricarsi da un file.

Anche se qui c'è un caso semplice, in realtà c'è molto di cui preoccuparsi. Che formato è il file, è sul disco locale, lo prendo da un'api, devo anche sapere come scrivere il file ecc ecc.

Dividi il caricamento e il salvataggio dei file in una classe di repository separata.

public class LoopedList
{
    public LoopedList(IEnumerable items) {...}
    public Item GetNext() {...}
}

public class ItemListRepository_File : IItemRepo
{
    public LoopedList GetItemList(string id) {...}
}

Il motivo per cui stai trovando difficile separare i due bit di codice è perché hai tutto statico. Questo ti impedisce di disaccoppiare.

Avere una LoopedList singleton nella tua App.Main se è necessario. Ma mantieni tutto il resto come variabili di istanza

    
risposta data 01.11.2017 - 21:00
fonte

Leggi altre domande sui tag