OOP bloccato su design degli oggetti / denominazione

-1

Sto progettando uno strumento .NET che utilizza la reflection per riportare informazioni sui metodi all'interno dei nostri assembly.

È completamente orientato agli oggetti e costituito da oggetti Assembly Objects, Class Objects e Method tutti con le mie informazioni definite che sto recuperando dalla riflessione. Un assembly contiene molte classi e una classe contiene molti metodi.

Il mio problema sta arrivando con una struttura e la convenzione di denominazione è facile da leggere e usare.

La mia struttura oggettuale attuale (di massima approssimazione) (in .NET) è solo:

var assemblyList = new List<Assembly>();

public class Assembly
{
    public string Name;
    public List<Class> Classes;
}

public class Class {
    public string Name;
    public List<Method> Methods;
}

public class Method {
    public string Name;
}

Funzionerebbe bene, tranne che ho proprietà aggiuntive che desidero avere accanto a ciascuna di queste liste come informazioni di raccolta dati. Questo e io ho delle classi interne che voglio avere per queste definizioni di classe, per esempio all'interno della classe Method potrei voler avere una classe che ho creato chiamata Types.

Il sotto potrebbe essere appropriato (sopporta me come una rappresentazione approssimativa, non gli oggetti reali) o sto facendo un sacco di cose. Non riesco a pensare ad una soluzione corretta, ma mi aspetto che ci sia un modo più semplice per farlo.

public class Class {
        public class Context {
            public string Name;
            public List<Method.Context> Methods;
        }

        public class List {
            public List<Context> List;
            public string propertyA;
            public int propertyB;
        }

        public class Tags {
            public const string MethodTypeA = "Ex1";
            public const string MethodTypeB = "Ex2";
        }
    }

    public class Method
        public class Context {
            public string Name;
        }

        public class List {
            public List<Context> List;
            public string propertyA;
            public int propertyB;
        }

        public class Tags {
            public const string ClassTypeA = "Ex1";
            public const string ClassTypeB = "Ex2";
        }
    }

Qualsiasi aiuto sarebbe apprezzato! Le mie capacità di nominare / strutturare le strutture sono piuttosto scarse.

    
posta Cyassin 23.05.2017 - 07:51
fonte

1 risposta

1

Suppongo che avrai alcune meta informazioni nel tuo contesto. Giusto?

Quindi potenzialmente potresti finire con una classe "God-Context", se vuoi, prova a mettere diversi concetti sotto lo stesso ombrello. Ad esempio, nel seguente esempio ci sono due concetti misti: uso e checksum.

someClassInstance.Context.ReferencedBy
someClassInstance.Context.MD5
someClassInstance.Context.SHA

Quindi invece di avere un contesto è meglio dividere. Qualcosa del genere:

someClassInstance.Usage.ReferencedBy
someClassInstance.Checksum.MD5
someClassInstance.Checksum.SHA

In alcuni scenari può essere un overhead introdurre una classe per concetto, così puoi facilmente combinare nomi ed esporre i concetti tramite le proprietà

someClassInstance.ReferencedBy
someClassInstance.MD5Checksum
someClassInstance.SHAChecksum

Nel tuo caso particolare sarebbe

 public class Class
 {
        public string Name { get; set; }
        public List<Method> Methods { get; set; } = new List<Method>();
        public List<Tag> Tags = new List<Tag>();

        ...
        public string SomeContextSpecificProperty1 { get; set; }
        ...
        public string SomeContextSpecificPropertyN { get; set; }
  }

  public class Method
  {
        public string Name;
        public List<Tag> Tags = new List<Tag>();
  }

  public class Tag
  {
      public string Value { get; set; }
  }

Se vuoi introdurre una classe per contesto, considera questo

public class Assembly
    {
        public string Name { get; set; }
        public List<Class> Classes { get; set; } = new List<Class>();
        public List<Tag> Tags = new List<Tag>();
        public AssemblyContext Context { get; set; }
        public class AssemblyContext
        {
            public string SomeContextSpecificProperty1 { get; set; }
            //,,,
            public string SomeContextSpecificPropertyN { get; set; }
        }
    }
    
risposta data 23.05.2017 - 13:11
fonte

Leggi altre domande sui tag