학습 목적으로 소켓 기반 클라이언트/서버 응용 프로그램을 작성하고 있습니다. 나는 패킷을 올바르게 처리 할 수 있도록 사용자 정의 프로토콜을 설계했다. 오늘날 코드의 일부 오래된 부분을 검사하면서 데이터 패킷을 만드는 내 방식에 많은 중복 코드가 포함되어 있다는 것을 깨달았습니다.어떤 디자인 패턴을 사용해야합니까?
나는 다른 종류의 패킷을 가지고 있습니다. ImagePacket, MessagePacket 등 모든 유형의 생성은 사소한 일에만 다르다. 예를 들어, 헤더와 구분자 생성은 동일하다.
이를 개선하기 위해, 난 (간체)과 같은 솔루션을 내놓았다 :
abstract class Packet
{
public Packet(object o)
{
MemoryStream memoryStream = new MemoryStream();
AddHeader(ref memoryStream);
AddData(ref memoryStream, obj);
AddDelimiter(ref memoryStream);
_packetBytes = memoryStream.ToArray();
memoryStream.Close();
}
protected abstract void AddData(ref MemoryStream ms, object obj);
는, addData 방법은 추상적 인 방법으로 구현 추상에 정의되어 AddHeader 및 AddDelimiter 반면 구체적인 클래스에서 재정의한다 클래스 패킷 그 자체.
잘 작동하고 이전과 많이 중복 된 코드가 없지만 AddData에 개체를 전달하는 것이 만족스럽지 않습니다. ImagePacket 생성자에 문자열을 지정하면 안된다는 것이 명확하지 않기 때문입니다.
// correct
Packet myMsgPacket = new MessagePacket("hello world");
Packet myImagePacket = new ImagePacket(image);
// wrong, but will be compiled :(
Packet myChaosPacket = new ImagePacket("muaha you're doomed");
정확한 데이터 형식이 전달되었는지 확인해야한다면 엄청난 양의 코드가 다시 나옵니다. 어떻게하면 중복 된 코드를 줄일 수 있지만 위에서 언급 한 문제를 없앨 수 있습니까?를 아래의 코멘트 당으로서 나는 명확 봤는데한다 : 당신이
Packet MyPacket = MyPacketFactory.CreatePacket(Data)
MyFactory.CreatePacket
IPacket
업데이트를 반환 공장 패턴을 사용할 필요가 같은
질문은 Data 매개 변수가 될 수있는 것입니다. 사용자는 Data가 문자열인지 이미지인지 알기를 원합니다. –
아마도 내가 분명히해야하지만 당연히 할 수 있습니다 - 나는 다른 데이터 형식과 아마도 문자열 데이터에 대한 추가'enum' 유형을 사용하는 많은 오버로드를 가질 수 있습니다 – Basic