2010-07-01 2 views
1

개체를 저장하는 데이터 구조가 public staticDataStructures 클래스가 있습니다. 객체를 데이터 구조에 추가하는 것은 수 많은 검사를 수행하고 프로세스를 기억하고 데이터를 재 배열해야하는 관련 프로세스입니다. Foo이라는 또 다른 클래스에서 객체를 데이터 구조에 추가해야합니다. ObjectFeed이라는 메서드를 사용하여 개체와 개체의 레이블을 매개 변수로 사용하여이 작업을 수행 할 수 있다고 생각했습니다. 레이블은 메소드에 오브젝트를 추가해야하는 데이터 구조를 알립니다. 단지뿐만 아니라 그 데이터에 액세스 할 수있는 방법에 매개 변수로 공공 데이터 구조를 전달적절한 데이터 구조에 개체를 추가하는 디자인

Public Class DataStructures 
{ 
    public static List<obj> object1Storage = new List<obj>(); 
    public static List<obj> object2Storage = new List<obj>(); 
    ... 
} 

Public Class Foo 
{ 
    public void ObjectFeed(/* PARAMETERS */) 
    { 
     //Code that generates an object called inspectionObject 
     //inspection object has an associated enum Type 
     if(objectType == Type.Type1) 
     { 
      addObject(inspectionObject, DataStructures.object1Storage); 
     } 
     if(objectType == Type.Type2) 
     { 
      addObject(inspectionObject, DataStructures.object2Storage); 
     } 
     ... 
    } 

    private void addObject(obj inspectionObject, List<obj> objStorage) 
    { 
     objStorage.Add(inspectionObject); 
     //And a lot more code 
    } 
} 

: 나는 또한 추가 할 객체를 걸릴 것 addObject라는 방법 및 매개 변수로 적절한 대상 데이터 구조를 가질 것 구조가 직접적으로 정확하지 않습니다. 이 작업을 수행하는 데 더 영리하고 직관적 인 방법이 있습니까? 예 내가 원래 인위적인에서

의 ObjectFeed 방법은 뚜렷한 목적을 제공하지 : 편집

. 나는 실제 세계에서 더 많은 것을 보일 수있는 방법을 다시 썼다.

답변

0

으로는 다른 답변에서 지적한 :

  1. public staticList의 나쁜 관행에게 있습니다
  2. addObject 방법은 모든 데이터 구조에 대해 동일하기 때문에,이 데이터 구조의 접근으로 구현되어야한다.

데이터 구조의 인스턴스화를 Foo로 이동하고 Foo의 addObject 메소드를 데이터 구조 아키텍처를보다 정확하게 나타내는 StorageLibrary라는 새로운 클래스로 이동했습니다.

private class StorageLibrary 
{ 
    private List<obj> storedObjects = new List<obj>(); 
    public void addObject(obj inspectionObject) 
    { 
     storedObjects.Add(inspectionObject); 
     //And a lot more code 
    } 
} 

public class Foo : StorageLibrary 
{ 
    //Declaration of libraries 
    public static StorageLibrary storage1 = new StorageLibrary(); 
    public static StorageLibrary storage2 = new StorageLibrary(); 
    ... 

    private void ObjectFeed(/* PARAMATERS */) 
    { 
     //generate objects 

     if (objectType == Type.Type1) 
     { 
      storage1.addObject(inspectionObject); 
     } 
     if (objectType == Type.Type2) 
     { 
      storage2.addObject(inspectionObject); 
     } 
     ... 
    } 
} 
2

개체 유형의 출처는 어디입니까? 문자열 값을 유형으로 전달하는 것은 거의 좋은 생각이 아닙니다. 다른 옵션을 고려해보십시오.

  1. 이 값의 열거 형을 만들고이를 사용하십시오. 필요한 경우 문자열에서 파싱하거나 문자열로 출력 할 수 있습니다.
  2. 아마 몇 가지 구체적인 방법 : FeedObjectType1 (object obj) 등을 사용하는 것이 합리적일까요? 이러한 변화는 얼마나 자주 발생합니까?

코드의 나머지 부분을 보지 않고도 확실한 답을 얻는 것은 정말 어렵습니다.

DataStructures 클래스의 공개 정적 목록을 표시하는 것은 대부분 좋은 디자인이 아닙니다. 먼저 개인용으로 만들고 필요한 실제 기능에 액세스 할 수있는 몇 가지 방법을 제공하는 것을 고려해 보겠습니다. addObject 메서드를 사용하여 목록을 래핑하는 것을 고려할 것이므로 목록을 인수로 전달할 필요가 없습니다. 그러나 당신의 경우에 그것이 의미가 있는지 다시 나는 확신하지 못한다.

2

어떤 종류의 글로벌 저장소처럼 DataStructures을 사용하는 것 같습니다. 내가 당신이 거기에 무엇을 저장하는지 모르겠다. 나는 당신이이 세계적인 저장 장치에 대한 충분한 이유가 있다고 가정 할 것이다.

그렇다면 각 목록을 데이터의 추가를 다루는 새로운 종류의 개체로 대체하고 관련 검사를 수행합니다. 같은

뭔가 :

interface IObjectStorage 
{ 
    void Add(object obj); 
    void Remove(object obj); 
} 

각 객체 저장 유형이 파생하고 자신의 논리를 제공 할 것이다. 또는 컬렉션 의미가 의미가있는 경우 Collection<T> 또는 유사한 것으로부터 파생 될 수 있습니다. 귀하의 예제가 지금 당장, ObjectFeed에 대한 사용법을 볼 수 없으며 멋진 속성 접근 자로 사용됩니다.

문자열을 통해 액세스 할 속성을 선택하면 나에게 불만이 들립니다.오타가 생기기 쉽습니다. 차라리 Type-GetType-method 또는 typeof() 구조를 통해 C#의 모든 개체에서 사용할 수있는 개체를 사용하고 싶습니다.

그러나. 전체 설정은 나에게 조금 잘못 느낀다. DataStructures 외.

먼저 정적 클래스를 테스트하는 것은 어렵습니다. 나는이 매장들을 필요로하는 유형으로이 상점들을 지나칠 것이다. 그것들을 다른 것들로 대체하는 것은 또한 어려울 것입니다. 인터페이스를 사용하면 적어도 구체적인 구현을 묶지 않을 것입니다.하지만 다른 위치를 사용하여 다른 코드에 객체를 저장하려면 어떻게해야할까요? 정적 클래스는 더 이상 관련이 없으므로 많은 코드를 변경해야합니다.

어쩌면 이러한 것들이 사용자의 통제를 벗어 났을 수도 있습니다. 잘 모르겠습니다. 예제 코드는 그 의미에서 다소 모호합니다.

관련 문제