퇴근5분전


프로젝트가 지루해져가서 잠깐 딴짓을 해본다. 

 소요 시간 : 1시간반쯤? 기록 10분...쿵..,  
 도구 : 종이 두장. ( 낙서가 생각하는데 도움을 준다. )

 막상 글을 다 적고 보니 전공자가 아니라서 그런지 부족한게 보여도 채워넣기가 쉽지 않다.
몰라서이기도 하고, 알아야 하는것이 있음에도 그걸 익힐 시간이 만만치 않기에... (핑계~ )

제목처럼 글하나를 프로그래밍 해본다.( 조금은 복잡하게... 말이다. )

물론 저 간단한 문장을 쉽다면 아주 아주 쉽게, 어렵다면 어렵게... 상황에 맞춰서 코딩을 하겠지만...

코딩전 객체설계단계를 연습삼아.. 만들어보자! 우선은 글에서 나타난 객체들을 구상한다.

 (나) 라는 주체가 있고 (종이)와 (글)을 쓰는 (펜) 이 존재하게 된다. 


 음. 네가지의 객체가 서로 관련되어 있다. 이를 간단한 구상도( 나만에 방법 )를 그려보자.


 
음 위에 종이와 펜도 구체화 해보자.

 간단하다.   중간에 대리자나 객체 또는 인터페이스... 등등.. 선택하고 싶은걸 넣으면 된다. 

코딩에 들어가야겠지? 
굳이 대리자를 써본이유는

  public void Write(string wrMsg)
        {
            _wPen.Data = wrMsg;
            //_wPaper.Get(_wPen.Draw);  // 기본사용..

            _wPaper.Get(delegate(Graphics g) {   
                g.DrawString(wrMsg, new Font("궁서체", 20f), Brushes.Red, new PointF(10, 100));
            });
        }

이걸 기록하기 위해서다.
( 반드시 제공되는 소스대로가 아닌 취향에 맞게 변경할수도 있다는 것을 제공해주기 위한 배려?...
    : 이걸 제공함으로 원치 않은 동작이 나타날수 있으니.. 설계시 설계자의 판단에 맞겨야겠지?  )
{
 * 국어인 한글을 단어 찾아보면서 써야되겠네... 
  반드시   [부사] 틀림없이 꼭.
  반듯이   [부사] 찾아보기: 반듯하다
}
아래는 소스 전문이다.

폼에 버튼 하나 추가되있고 버튼에 Click이벤트를 추가한것 뿐이다. 

위 구성도가 있으니... 주석은 패쑤!

 public partial class Form1 : Form
    {
        Writer me = null;
        Paper paper = null;
        Pen pen = null;
        public Form1()
        {
            InitializeComponent();
            pen = new Pen();
            paper = new Paper(this);
            pen.Penfont = this.Font;
            me = new Writer( pen, paper );
        }

        protected override void OnFormClosed(FormClosedEventArgs e)
        {
            base.OnFormClosed(e);
            pen = null;
            paper.Dispose();
            paper = null;
            me = null;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            me.Write("가나다라");
        }
    }

    public class Writer
    {
        Pen _wPen = null;
        Paper _wPaper = null;

        public Writer(Pen p1, Paper p2)
        {
            _wPaper = p2;
            _wPen = p1;
        }

        public void Write(string wrMsg)
        {
            _wPen.Data = wrMsg;
            _wPaper.Get(_wPen.Draw);
        }
    }

    public delegate void Delegate_Draw(Graphics paper);

    public class Paper : IDisposable
    {
        Graphics _g = null;

        public Paper( Control ctrl)
        {
            _g = Graphics.FromHwnd( ctrl.Handle );
        }

        public void Get(Delegate_Draw toolDraw)
        {
            toolDraw(_g);
        }

        #region IDisposable 멤버

        public void Dispose()
        {
            _g.Dispose();
            _g = null;
        }

        #endregion
    }

    public class Pen
    {
        string _data = string.Empty;

        public string Data
        {
            get { return _data; }
            set { _data = value; }
        }

        Font _penfont;

        public Font Penfont
        {
            get { return _penfont; }
            set { _penfont = value; }
        }

        public void Draw(Graphics  g)
        {
            g.DrawString(_data, _penfont, Brushes.Black, new PointF());
        }
    }