서버 - 클라이언트 ...
새로 만든 서버와 클라이언트 모델이다.
스샷만 넣는다..
중요한 컨셉은. 데이타 전송은 표준데이타를 사용하고 실제 사용하는 데이타를 분리해냈다.
서버와 클라이언트간 기본 통신메세지는 표준으로 정의 하고.
실제 응용프로그램에서 사용되는 데이타 모델을 패킷에서 분리해냈다.
이는 응용프로그램에서 사용되는 데이타 모델을 필요에 의해 바꿀수 있다.
위에 사용되는 데이타는 기본데이타(CommPack) + 응용데이타(ChattMsg)를 더해서 패킷을 만들어
Tcp/Ip 통신으로 보낸다.
전에 만들어두었던 모델에 전부터 하려던걸 추가했다.
ChattMsg msg = new ChattMsg ();
msg.ChattMessage = this.textBox2.Text;
CommPack pack = new CommPack ();
pack.CommandCode = CommPack.__DATATRANS;
pack.FromID = client.ID;
pack.ToID = client.ID;
pack.Set_TransData(msg); // 데이타를 표준 패킷에 싣는다!
client.Send(pack);
this.textBox2.Clear();
--> 데이타를 보내는 것임.
한글은 어려웡... 실어나른다. 싣다. 암튼... 아래 사전을 찾아보았다.
싣다?
http://krdic.daum.net/dickr/contents.do?offset=A024243500&query1=A024243500#A024243500
'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글
그림판? 그림 이동? 별그리기... (2) | 2010.07.23 |
---|---|
런타임상에서의 컨트롤 사이즈 드래그!!! (0) | 2010.06.10 |
타이머 구현... (0) | 2010.04.08 |
속성에 UIEditor 달기( PropertyGrid 이용 ) (0) | 2010.03.25 |
MDI 폼 스크롤바 없애기 (0) | 2010.03.25 |
비지터 패턴...
쉽다면 쉽고.. 어렵다면 어려운 패턴이었음. 아직도 가끔은 헷갈리는데...
예제로 본것들중 기억에 남는것은 기자가 각 방송국을 들락 날락 거린다는 예제였던것 같다.
콤보짓 없이 비지터를 살짝쿵.. 비스므리 해보려 했더니... 좀..골때린게 나왔다. 의미상 별거 없어보이긴 하는데..
어쨌거나 저쨌거나..
방문자(Visitor)는 자기가 방문하게될 요소(Ac)에 자기를 등록하도록 Acceptor(방문자 v); 가 요구되고 이를 인터페이스로 구현된다.
이 인터페이스를 통해 방문자의 .Visit( 요소 )를 호출하면서 구조(자료리스트)를 순회 하게 된다.
단순하게 생각하자!!
방문자는 방문하게될 대상에 자기가 들어갈 곳을(Acceptor) 요구하고 이를 통해 자기가 들어가서
방문(Visit())을 하게 되며 대상요소에 대한 처리는 Visit() 내에서 처리한다!!..
소스를 보자.. 말로는 역시 풀어내는것은 아직 표현부족으로 한계....
추가: 방문자의 문제 처리를 바꾸고자 한다면
간단히 짝수 출력라인 주석을 하면 홀수만 보이게된다... 일이 구분된다는 것이지.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Ac a1 = new Ac("a1"); // <== 각 요소들...
Ac a2 = new Ac("a2");
Ac a3 = new Ac("a3");
Ac a4 = new Ac("a4");
Ac a5 = new Ac("a5");
Ac a6 = new Ac("a6");
Ac a7 = new Ac("a7");
Ac a8 = new Ac("a8");
Ac a9 = new Ac("a9");
Ac a10 = new Ac("a10");
a1._ac = a10; <-- 하위 요소들 추가!!
a10._ac = a4;
a5._ac = a7;
List<Ac> ls = new List<Ac>(); // <-- 비지터가 방문하게될 리스트...
ls.Add(a1);
ls.Add(a2);
ls.Add(a3);
ls.Add(a5);
ls.Add(a6);
ls.Add(a8);
ls.Add(a9);
Visitor v = new Visitor();
foreach( Ac item in ls )
v.Visit(item); // <--- 각각 방문하게 된다.
this.textBox1.Text = v.ToString(); // <-- 방문결과...
}
}
public interface IVisitor
{
void Visit(Ac ac);
}
public interface IAcc
{
void Acceptor( IVisitor v);
}
public class Ac : IAcc // <-- 방문하게 될 대상 객체이다.
{
static int InstanceCount = 0;
static void Count() { InstanceCount++; }
int _i = 0;
public Ac _ac = null;
// <-- 하위 요소가 존재시... 방문자가 순회 하게 될.. 요소로 판정하기 위해... ( 콤포짓 패턴... )
public int I
{
get { return _i; }
}
string _name = "";
public Ac(string __name)
{
Count();
_i = InstanceCount;
_name = __name;
}
#region IAcc 멤버
public void Acceptor(IVisitor v)
{
v.Visit(this); // 비지터에 AC자신에 대한 처리를 맡긴다.
}
#endregion
public override string ToString()
{
return _name;
}
}
public class Visitor : IVisitor //<-- 방문자...
{
StringBuilder sb = new StringBuilder();
public void Clear()
{
sb.Remove(0, sb.Length);
}
#region IVisitor 멤버
public void Visit(Ac ac) //<-- 방문될 요소를 받는다.
{
if( ac.I % 2 == 0 )
{
sb.AppendLine(" "+ac.ToString()+"(짝수)");
if (ac._ac == null) sb.AppendLine();
}
else
{
sb.AppendLine(" " + ac.ToString() + "(홀수)");
if (ac._ac == null) sb.AppendLine();
}
if (ac._ac != null)
{
ac._ac.Acceptor(this);
//<-- 하위 요소가 존재시 방문등록을 한다.
이로써 방문자는 다시 하위 요소에 자기가 등록되면서 visit가 재귀형태로 호출된다.
}
}
#endregion
public override string ToString()
{
return sb.ToString();
}
}
'# 5) 디자인패턴(for .NET )' 카테고리의 다른 글
Flow] Condition 만들기 - 비지터 패턴응용... (0) | 2018.04.27 |
---|---|
Commad? 응용... (0) | 2012.01.19 |
콤포지트 패턴... (0) | 2010.05.06 |
객체를 공부하면서... 커플링? 느슨한결합도? (0) | 2010.05.04 |
체인 패턴... (0) | 2010.05.04 |
콤포지트 패턴...
움... 이 패턴을 첨 접할때 Tree라는 개념을 알고 본터라.. 가장 처음 접했던 어려운 패턴이었다.
단순해보이면서도 왠지... 거북했던 패턴으로 기억나는데...
가장 최근에 적용하고 사용한 방법중에 XmlHelper를 만들때
각 Element를 메모리에 올리기 위한 자료구조를 만들때 사용했었다.
Element를 받고 하위 Element를 동일한 타입으로 설정하고 추가 추가...
재귀를 통해 읽어들이고 각각 요구사항에 맞춰 파싱도 하고 출력도 하고...
단위객체
{
단위객체[] 하위List;
Print()
{
"<자기자신>"
foreach( 단위객체 obj in 하위List )
obj.Print()
"</자기자신>"
}
}
대략...이랬다...
사용방법은 꾀 많다.
트리구조를 가지고 있는 자료구조에 적용하기 쉽기때문에...랄까?
'# 5) 디자인패턴(for .NET )' 카테고리의 다른 글
Commad? 응용... (0) | 2012.01.19 |
---|---|
비지터 패턴... (0) | 2010.05.06 |
객체를 공부하면서... 커플링? 느슨한결합도? (0) | 2010.05.04 |
체인 패턴... (0) | 2010.05.04 |
커맨드패턴 (0) | 2010.05.03 |
객체를 공부하면서... 커플링? 느슨한결합도?
요즘 공부를 하면서 객체간에 커플링과 느슨한결합도에 대한 다시한번더 생각하게 된다.
내가 주도하는 프로젝트에서야 내가 만든 프레임웍등을 이용할때나 위... 커플링과 느슨한결합도에 신경을 쓸까..?
프리형태의 입장인 지금은 저딴건 개나 줘버렷!!
지금껏 하루 하루 시간 쪼개서 공부해온 것들은 모두.. 내가 주도하거나 내가 주축이 되면.. 가능한것들 뿐이다.
SW공학.. 자체가 비전공자인 내가 공부해봤자라는 의미가 될수 있는듯 하다.
물론 알아두면 좋고 알아야 하는것이기도 하고... 물론 몰라도 돈버는데는 영향이 없어보인다.
객체와 객체를 연결지으면서 서로간에 간섭이 얼마나 일어나느냐를 커플링 척도로 보는데 이는 프리로 일하면서
관심밖에 사항이 된다. 결합도 역시.. 그렇다.
느슨하게 해주는 주체가 무엇이 될까? 인터페이스? 추상화된 기반객체?
음... 그렇다면... 내가 주가 되었을때의 이 개념들을 어떻게 써먹을지도 고민해봐야 하는데...
얼마전 완성된 프레임웍은 내부적으론 유지보수에 대한 대비를 많이 했지만.. 실제 사용에 있어서의 결합도는 거의 무시한채 작업이 되었는데... 이건 어떻게 한다?
객체가 객체를 사용하는데 있어서 직접적이 호출이 아닌 중간에 하나를 거쳐서 호출하게끔하여 실제 호출되는 객체의 변화에 조금 덜 반응할수 있도록 맞춰주는것이 결합도를 낮춰주는 방법이라고 난 생각한다.
개발자와 개발자간에 직접적인 업무교류가 아닌 중간에 PL을 거쳐 협업을 하는것 처럼... 이랄까? 비유가 좀 아닌가?
아무튼.. 사용자는 실제 호출되는 객체에 대해 모르는 편이 좋다고 본다. 곧 블랙박스가 된다.
알아야 하는것은 인터페이스.. 정도? 기반클래스에서 제공되는 메서드와 프로퍼티?랄까?
현재의 프로젝트는 인터페이스 기반에 호출이 아닌 해당 객체를 직접 호출하는 형태이다.
또한 객체를 생성하는데 있어서.. 해당 객체를 직접 생성하고 있는데 이를 분리하는것이 곧 생성패턴들을 이용 하는것인데
그런것도 없어보이고...
느슨함과 커플링에 대한 생각은 좀더 찾아보고 고려해보아야 할 것이다.
'# 5) 디자인패턴(for .NET )' 카테고리의 다른 글
비지터 패턴... (0) | 2010.05.06 |
---|---|
콤포지트 패턴... (0) | 2010.05.06 |
체인 패턴... (0) | 2010.05.04 |
커맨드패턴 (0) | 2010.05.03 |
디자인 패턴 설명이 정말 쉬운곳... (0) | 2010.03.16 |
체인 패턴...
뭐 볼꺼 있나... 요약하자...
문제 -- 해결책 따로 따로 매칭시켜서 처리 해보자..
어떤 문제들을 해결할수 있는 방법 1,2,3,... N 개가 존재할시 이 해결법들을 하나로 묶어 관리 하며
제시되는 문제들을 받았을때 이 문제를 해결할수 있는놈이 처리하자!! 라는 취지임.
없으면 말고.. 라는? ㅋㅋ
문제1 : 문제, 문제 2 : 문제, 문제3 : 문제, 문제4 : 문제, 문제n : 문제...
해결법1 : 해결 . 해결법2 : 해결 , 해결법3 : 해결 , 해결법4 : 해결 ... 해결법n : 해결 .
해결 { 해결 Next; setNext( 해결 ); 풀이( 문제 ); 내꺼( 문제 ); }
이렇게 따로 따로 분리하여 각 해결법과 문제를 볼수 있게 된다.
해결법1.setNext(해결법2).setNext( 해결법3 )... <-- 체인 처럼. 각각 연결을 시켜둔다.
해결법1.풀이( 문제1 );
해결법1.풀이( 문제2 ); ...
풀이 내부에서는 자기가 풀수 있는 문제인지 체크하고 풀거나 또는 다음으로 넘겨준다.
이런 순서라는거쥐... 문제는 이것도 지식이되고 만다는거...
어따 써머거? 음... 어따 써먹을지 찾아보자. 전에 뭔가 하다가 써먹으려다 실패했었다.
'# 5) 디자인패턴(for .NET )' 카테고리의 다른 글
콤포지트 패턴... (0) | 2010.05.06 |
---|---|
객체를 공부하면서... 커플링? 느슨한결합도? (0) | 2010.05.04 |
커맨드패턴 (0) | 2010.05.03 |
디자인 패턴 설명이 정말 쉬운곳... (0) | 2010.03.16 |
패턴을 써서 좋은점... (0) | 2010.02.17 |
커맨드패턴
명령 자체를 객체로 만든다 라는 개념인데 잘 보면 어렵진 않고...
다만 이걸 어따 써먹느냐..가 관건인듯 하다.
늘 그렇듯이 쌓아올린 지식은 지혜로 바꾸어내야만 한다. 써먹을수 있는 지식을 많이 가지는 것이 곧 내가 지향하는 목표가 아닌가..
프로그래밍에 대한 전반적인 지식들은 인터넷, 서적등으로 얼마든지 취할수 있으나 이것을 써먹지 못하면... 알아서 뭐하겠는가?
간단히 커맨드패턴을 요약하자면..
1. 명령{ 수행() }
2. 수행객체{ 수행할일(); }
1 + 2 . 명령처리객체 : 명령
{
수행객체 ;
수행() { 수행객체.수행()}
}
3. 요청처리객체
{
명령;
수행(){ 명령.수행() }
}
보통의 객체와 객체사이의 메세지 전달구조에서는 객체와 객체간에 메세지를 공통으로 사용하기 위해서 Interface를 사용하는데 단일 메서드 일때는 그냥 호출해도 되지만 한번에 호출될 메세지가 많을때 이를 캡슐화 할때 이용할수 있다.
예제로 본 문서에는 전사, 법사, 힐러 같은경우를 예로 들고 있다
Attack() 공격시 전사가 취하는 행동, 법사가 취하는 행동, 힐러가 취하는 행동이 각각 다르지만. Attack()이란 명령으로 통합관리 할수 있고 이를 커맨드패턴을 이용하는 기법에 대해 설명하고 있다.
1.
명령 { Attack() }
2.
전사{ 준비자세(); 칼을 든다(); 후려친다(); 준비자세(); }
법사{ 준비자세(); 책을 편다(); 스킬시전한다(); 준비자세();}
...
1 + 2.
전사명령처리 : 명령 {
전사;
Attack()
{
전사.칼을든다();
전사.후려친다();
전사.준비자세();
}
3. 캐릭터명령
{
명령 :
SetCmd( 명령 );
Attack(){ 명령.Attack(); }
}
전사 워리어 = new 전사();
명령 cmd = new 전사명령처리( 워리어 );
캐릭터명령 cCmd = new 캐릭터명령( );
cCmd.SetCmd( cmd );
cCmd.Attack();
뭐 이런식이라는데...
명령을 객체화 하여 실제행동에 사용되는 객체와 명령을 요청한 객체간 관계를 느슨하게 만들어주는... 역할을 한다.
느슨하게!! 라는것에 대한 생각을 해볼필요가 있어보인다.
'# 5) 디자인패턴(for .NET )' 카테고리의 다른 글
객체를 공부하면서... 커플링? 느슨한결합도? (0) | 2010.05.04 |
---|---|
체인 패턴... (0) | 2010.05.04 |
디자인 패턴 설명이 정말 쉬운곳... (0) | 2010.03.16 |
패턴을 써서 좋은점... (0) | 2010.02.17 |
디자인 패턴에 관하여... (0) | 2010.02.17 |
한순간에 방심으로 죽을뻔했다...
자가용을 몰다가 한순간 아찔했던 순간이 토요일은 두번이나 겪었다.
이천에 도착해서 고속도로를 빠져나오자 마자. 2차선에서 직진중인데 뜬금없이 1톤 포토가 들어오면서 깜빡이.. 썅...
내차를 못본건가?? 차가 길을 잘못들어서서 3차선에서 1차선으로 좌회전하기위해 급하게 끼어들어왔나분데... 쫌만 브레이크 늦게 밟았음 들이 받을뻔했었다...
또한번은 어머니 모시고 올라와서 이모가 일하시는 가게로 가던중... 가끔 다니던 길이지만 다니던 학교앞이라
U턴을 하기위해 차선을 타고 가는데... 순간 U턴차선이 사라졌음을 보고.. 어랏.. 하는사이에 앞 신호도 바뀌고 나는
멍하니 교차로 안으로 진입해버린것... 혼자 벙쪄서... 정말 순간 아무 생각도 안나던 상황...
다행히 사고없이 교차로를 통과 하였다. 정말 한순간 머리속이 하얗게 바뀌었다..
난 정말 차 운전을 하면 안되는 그런 류의 사람인지도 모른다. 머리속에 생각이 너무 많아서 가끔.. 혼란스러울때가 있는데... 그럴때면 멍해진다. 운전하기 정말 싫다.
내가 운전하는 것에 대한 거부를 표시해도 가족들은 그저 무시한다. 어쩔수 없이 짊어질수밖에...
신호위반으로 찍혀서 날아와도... 뭐 그닥... 아깝지 않다. 다행히 천만 .. 다행히.. 살아 왔기 때문에... 그깟 벌금... 내주마!
'--- 취미 > 생각하기' 카테고리의 다른 글
아 또 다시 찾아오는 슬럼프인가??? (0) | 2010.09.05 |
---|---|
침묵이 필요할때~~~ (0) | 2010.07.02 |
[멋진글... (펌)]현재 하고 있는 세븐소울즈가 캐쉬템을 팔면서 올라온글... (0) | 2010.04.30 |
세상은 사소한것들을 무시하는듯 하다... (0) | 2010.03.12 |
FlexGrid의 Header Merge 구현하다가 생긴일... (0) | 2010.02.11 |
[멋진글... (펌)]현재 하고 있는 세븐소울즈가 캐쉬템을 팔면서 올라온글...
온라인 게임을 하면서... 이런 글을 게시판에서 보는건 처음이었다.
늘 상대캐릭 까대기 바쁘고 적길드 욕하는 거라든가... 이러네 저러네... 하는글들만 봐왔는데..
상당히 공감이 가는 글이다.
온라인 게임을 많이 해왔지만... 대부분의 운영회사들은 이익을 목적으로 게임을 개발하고 서비스 하겠지만
완성도에 기대를 가지는회사는 몇안될것이다. 한게임과 씨알에서 서비스하는 세븐소울즈...
개인적으론 그저 그런겜이다. 할거없으니 잠깐씩 하는 게임인데... 나름 게임에 애착을 가진사람이 있구나...
드래곤볼 온라인도 세븐소울즈도 ... 동급수준이다.
요새나온 겜들이 뭐 죄다 부분 유료화를 하며 캐쉬를 팔아먹기 바쁜데... 아래글처럼 좀 겜좀 안정화 하고
뭔가 팔아묵든가 했음 좋겠다. 조만간 접을겜이지만 나름 생각이 있는 글같아서 복사해왔다.
게시한분께 양해를 못구해서 그냥 가져왔으나.. 혹 문제가 되면 지우겠다.
| |||||||||||||||||||||||||||||||
|
'--- 취미 > 생각하기' 카테고리의 다른 글
침묵이 필요할때~~~ (0) | 2010.07.02 |
---|---|
한순간에 방심으로 죽을뻔했다... (0) | 2010.05.03 |
세상은 사소한것들을 무시하는듯 하다... (0) | 2010.03.12 |
FlexGrid의 Header Merge 구현하다가 생긴일... (0) | 2010.02.11 |
노트북을 사다... (0) | 2010.01.16 |
미스테리... vs2008 오류..
Unable to copy file "D:\Daebang\WPF_Login\Wpf.TabControl.dll" to "bin\Debug\Wpf.TabControl.dll". 'bin\Debug\Wpf.TabControl.dll' 경로에 대한 액세스가 거부되었습니다.
소스를 소스세이프에 바인딩 하면서 참조 경로 설정값을 특정 디렉토리로 변경해주었다.
이유는 기존에 따로 소스관리를 해주던 소스를 소스세이프로 통합관리 한다기에 옮겨주다보니 경로를 바꿔주어야 했었다.
바인딩하면서 경로를 바꿔주고 빌드를 하던중!! 한프로젝트에서 위와 같은 에러가 발생...
왜인지도 모르고 3시간을 다시 빌드를 하며 참조 dll을 다시 연결해주고.. 미친짓을 몇번이나 했으나...
아놔... 그닥 이유도 모른채 다시 빌드가 되었다. ㅡㅡ;;
추측 : 해당 프로젝트에 관련 된 프로젝트가 2개 있는데 그 두 프로젝트의 참조경로를 바꾸면서 '새로고침'을 안해서?
참조된 dll의 로컬경로 복사가 실행중에 다른 프로젝트의 관련 dll이 복사되면서 두 파일간 쫑이 난듯 한데...
정확한 이유를 잘 모르겠는뒝??? 음... 테스트를 한번 해볼까낭.
참조경로를 기존 경로로 하나 바꾸고 빌드를 해보자!!
ㅡ.,ㅡ 에러가 안뜬다!! 뭐쥐??
썅!! 이유도 모른채.. 해결되면 어쩌라는겨~~
'# 1) 프로그래밍' 카테고리의 다른 글
나는 펜으로 종이에 글을 쓴다. 를 프로그래밍한다묜??? (0) | 2010.05.20 |
---|---|
TCP.IP 초기 구상 모델... (0) | 2010.05.09 |
컨트롤 타원 회전시키기... (0) | 2010.04.08 |
프로그래밍 설계? (0) | 2010.04.05 |
Xml 관련 객체가 한번더 정리가 되었다. (0) | 2010.04.01 |
타이머 구현...
훈스 게시판에 힘들게 타이머를 구현하시는 분이 계셔서 퇴근하고 잠깐 머리도 식힐겸... 1시간가량 작성해보았다.
Clock개념을 이용해서 true 가 들어올때마다 계수를 하여 0, 0 , 0 이 될때까지... 카운트를 한다.
카운트 완료시 백그라운드는 색이 바뀐다.
신호 제어를 통해 전체 클럭을 주고 안주고 한다.
머 그닥 달건 없고... 소스에 주석!!을 통해 추상화 부터 구현까지 어떤 과정을 거쳤는지 간단히 써놓았다.
/*
타이머를 우선 추상화 합니다.
*
* Reset ();
* Setting( 시간)
* Start(); -> Pause();
* Stop();
*
* 기본적인 타이머 동작을 우선 살펴보면.
*
* 지정된 시간을 역카운트 해서 00: 00: 00이 되면 자동 멈추고 알람발생
* 지정된 시간을 역카운트 중 Pause상태가 되면 Reset() Or Start() or Stop() 가능
*
* 조금더... 생각해서 실제로 디지탈적으로 구현하기 위해 클럭 개념을 이용합니다.
*
* Tick당 계수되는걸로 구현합니다. 우선 간단히 추상화가 되었고
*
* 이에 맞춰 이 타이머에 필요한 부품들을 생각해봅니다.
*
* 1. 기본적인 디스플레이 ( 라벨 또는 TextBox ) : 입력가능하여야 하므로 Textbox로... 선정.
* 2 . 타이머별로 이름붙이는건 옵션으로 해서 라벨하나더.
* 3. 클럭을 받아들일 인터페이스
* 4. 이 인터페이스에 부탁될 이벤트... or 내부 메서드
* 5. 타이머가 구동중인지 알아볼 상태플래그.
*
* 대충 요약 완료!
*/
주석에 맞춰 코딩을 시작해서 1시간가량에 끝났다.
쩝!!
'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글
런타임상에서의 컨트롤 사이즈 드래그!!! (0) | 2010.06.10 |
---|---|
서버 - 클라이언트 ... (0) | 2010.05.08 |
속성에 UIEditor 달기( PropertyGrid 이용 ) (0) | 2010.03.25 |
MDI 폼 스크롤바 없애기 (0) | 2010.03.25 |
폼에 파일 드래그앤드랍 하기 (0) | 2010.03.25 |