2011-11-08 3 views
1

코드 예제는 C#이지만 일반적인 OO 질문입니다.프로그램 전체에 사용되는 공용 정적 데이터

당신은 어떤이있는 비의 프로그램을 작성 : 나는 OO 규칙에 따라 알

는, 클래스 커플 링 등

이 예제를 고려, 최소화해야하며, 회원은 가능한 비밀로 유지되어야한다 데이터 집합의 종류 (나는 System.Data.DataSet에 대해 말하지 않고있다.)는 말 그대로 프로그램의 모든 측면에서 사용된다. 사실, 프로그램은 기본적으로 데이터 세트를로드, 표시, 조작 및 저장하기 위해 존재합니다. 또한 언제든지 하나의 데이터 세트 만로드 될 수 있으며 프로그램이 열릴 때로드됩니다.

우리는 우리가

public void ShowSomeGraphs(IData data) 
{ 
    // do stuff with data which implements IData 
} 

그러나 우리는 잠재적으로 예를 들어, Programpublic static Data 멤버를 저장할 수있는 것, 엄격 OO 규칙을 따라야합니다.

public void ShowSomeGraphs() 
{ 
    // do stuff with Program.Data 
} 

반면에 우리는 클래스 결합을 크게 증가시키기 위해 약간 더 짧은 기능 서명을 교환했습니다. 반면에, 우리는 더 이상 실질적으로 함수마다 데이터 매개 변수를 전달하지 않습니다. 모든 곳.

오른쪽 대답은 아마도 가능합니다. 가능하면 클래스 연결을 피하십시오. 로컬 데이터 변수는 포인터 일 뿐이므로 메모리 오버 헤드는 무시할 수 있으며 클래스가 분리되어 있으므로 나중에 다른 곳에서 사용할 수 있습니다.

현실적으로 말하자면 Data 클래스의 구조는 다른 응용 프로그램에서 달라지기 때문에이 프로그램에서 수업을 끌어 와서 다른 곳으로 옮길 수는 없습니다. 과 같은 방식으로 클래스를 작성하는 데 필요한 추가 시간과 노력은 이해 관계자에게 정당화하기 어려울 수 있습니다.

나는 지금 이런 종류의 프로그램을 만들고있다. 그리고 나는 OO-canon 접근법을 사용했다. 데이터 매개 변수는 필요한 곳에 전달된다. IData 인터페이스와의 클래스 결합을 최소화하여 향후 코드 재구성을 위해 데이터 세트를 일반화한다. -용도. 응용 프로그램이 주어지면이 코드를 다시 사용하지 않을 것이라고 확신합니다. 이러한 여분의 인터페이스와 추상화가 없으면 프로그램은 최종 사용자와 관련하여 정확히 동일하게 작동했지만 두통과 개발 시간이 크게 줄어 들었습니다.

이 점에 대해 어떻게 생각하십니까? 가능하면 클래스가 분리되어 있는지 확인하기 위해 인터페이스와 일반화를 작성하는 데 여분의 시간을 소비하는 것이 합당하다고 생각하십니까? 특히 나중에 다른 클래스를 사용할 수없는 경우가 있습니다.

+0

정말 의견의 문제입니다. 그것은 코드 스타일과 시간의 문제입니다. 프로그램은 가능한 한 최소한의 버그로 작동하도록되어 있습니다. 코드 스타일은 복잡성을 줄이고 코드를 이해하기 쉬우 며 변경 사항에 더 적합하고 프로젝트간에 재사용하기위한 것입니다. 실제로 무엇을하기로 결정 했습니까? – galchen

+0

@Ozzah : 클라이언트 코드에서 데이터 인터페이스에 쉽게 액세스 할 수 있도록 느슨한 결합을 허용하는 단일 솔루션을 얼마나 쉽고 빠르게 구현할 수 있는지 보여주기 위해 코드 샘플을 추가했습니다. –

답변

1

이상 고민하지 마십시오. 진지하게.

소프트웨어 패러다임/패턴은 우리를 도울 수 있고 독단적으로 따라갈 수 없습니다.

당신은 느슨한 커플 링 과잉을 고려해야한다는 것을 명확히 밝혀줍니다. 그 이유는 정당화 할 수 있습니다. 따라서 사용하지 마십시오.

+0

"고뇌"는 강한 단어입니다. 저는 항상 엄격한 상황에 대해 많은 의견을 제시 할 수있는 엄격한 규칙에 대한 제 의견을 가지고 있습니다. 내 부서의 유일한 프로그래머로서 나는 내 종류와 많은 접촉을 얻지 못했고 다른 경험있는 사람들의 의견이 무엇인지 궁금했습니다. – Ozzah

1

singleton pattern을 사용하여 IData 인터페이스를 가져 오는 메소드 또는 읽기 전용 속성을 사용하는 것은 어떻습니까? 이렇게하면 매우 얇은 싱글 톤 클래스에만 결합 할 수 있으며 데이터 세트와의 모든 상호 작용은 IData 인터페이스를 통해 수행됩니다.

(필자는 단단히 결합하지 않을 것입니다.이 앱을 많이 사용하지 않더라도 개발 중에 문제가 발생하여 인터페이스를 통해 데이터에 액세스 한 경우보다 훨씬 많은 코드를 처리해야합니다.

코드 샘플

using System; 

public class MyClass { 
    public static void Main() { 
     // simple usage: 
     Console.WriteLine("From Main: " + Singleton.Instance.IMyData.GetData()); 
     // client code from another type: 
     new ClientObj().DoWork(); 
     Console.ReadKey(); 
    } 
} 

public sealed class Singleton { 
    // standard singleton stuff: 
    private static readonly Singleton _instance = new Singleton(); 
    private Singleton(){} 
    public static Singleton Instance {get { return _instance; }} 
    // data interface stuff: 
    private MyData _myData = new MyData(); 
    public IData IMyData {get { return _myData; }} 
} 

// the interface: 
public interface IData { 
    string GetData(); 
} 

// concrete implementation of the data class 
public class MyData : IData { 
    public string GetData() {return "Hello World!";} 
} 

// example of a type using the singleton and the IData interface 
public class ClientObj { 
    public void DoWork() { 
     IData data = Singleton.Instance.IMyData; 
     string str = data.GetData(); 
     Console.WriteLine("From other obj: " + str); 
    } 
} 

몇 가지주의 사항 : 위의 제안 싱글 솔루션의은 코드 샘플 위 완전히 싱글 및 공유 인터페이스의 개념을 보여주기 위해 아래로 제거한다. 스레드 안전성이 구현되지 않았고 데이터 객체 등의 초기화가 없습니다.

0

글쎄, 텍스트에는 하나의 큰 가정이 있습니다. 프로그램에는 항상 하나의 데이터 세트 만 있습니다. 그 상태가 항상 유지 될 것이라고 확신합니까? 워드 프로세서가 한 번에 하나의 텍스트 만 저장할 수있는 시간이있었습니다. 한 번에 여러 파일을 열 수있는 것이 표준입니다. 첫 번째 웹 브라우저가 한 번에 하나의 웹 페이지 만 열 수 있다면 놀라지 않을 것입니다. 오늘날 아무도 여러 페이지를 동시에 열 수없는 웹 브라우저를 사용하지 않습니다. 저는 여러분이 프로그램에서 그 중 하나만있을 것이라고 말할 수있는 종류의 물건이 아주 희귀하다고 생각합니다. 실제로 전역 객체 또는 싱글 톤을 만들 수있는 유일한 객체는 객체 팩토리입니다.

한편, 각 함수 호출에 대해 객체를 전달하는 것은 나에게 과도한 것처럼 보입니다. 그러므로 나는 중도에 갈 것입니다 : 객체가 "전역"객체를 기억하도록하십시오. 그래서 생성자를 통해서만 객체를 전달하면됩니다. 이렇게하면 각 단일 객체가 하나의 Data 객체로 제한되지만, 사용자가 결정하기 만하면 프로그램에 여러 Data 객체를 쉽게 가질 수 있습니다.

+0

공개적으로 사용되는 소프트웨어에 대해 이야기하고 있습니다. 워드 프로세서는 모든 사람이 사용하므로 사용 스타일은 무한대로 다양합니다. 내 프로그램은 내 회사의 두 사람과 다른 사람이 사용하지 않습니다. 나는 결코 하나 이상의 데이터 세트에 대한 필요성이 절대 없을 것이라고 확신합니다. 제가 기업을 위해 작성한 꽤 많은 프로그램들이 이와 같았습니다. 그래서 그렇게 희귀하지는 않다고 생각합니다. – Ozzah