퇴근5분전


한글로 만들었더니 대박!!! 지저분함. ㅡ.,ㅡ;

----------------------------------------------------------- 훈스 팁게시판에 올린 글! 그대로..

소스를 보시고 대체 이건 뭥미? 하실텐데요...

오늘 질문게시판에 TextBox에 들어온 숫자의 갯수가 4개가 연속이면 제거해야된다는 글을

들어온 문자열중 4개가 중복되면 제거로 잘못보고 ㅡ.,ㅡ;;; 아래 클래스를 만들었었습니다.  난독증...

처음 클래스명과 변수명들은 모두 영문자로 늘 하던데로 대충.. 때려맞춰서 만들어놓고 보니

이걸 미친척 한글로 바꿔보고 싶은 생각이 문득 들어... 만들어보았습니다.

어떤가요?잘 지었는지? 검사와 검색이란 단어를 적용하려니.. 한글 사전없이는 힘든것 같네요.(아래도 불분명합니다. )

한글로 지어놓으니 대략 난감하네요. 하하하.

한글로 써놓으니 글씨 폰트도 영문자랑 안맞아서 그런지 많이 지저분하네요.

만들어본 목적

객체지향 <-- 을 되새기며 객체이름을 명시하고 기능을 명시하면서 코드를 문장으로 볼수 있다면... 이란 오랜

생각끝에 영어로 안되서 ㅡ.,ㅡ;; 한글로 도전해봤습니다.

중복문자처리객체.제거실행(  this.textBox1.Text  );

조금은 억지스럽지만 ^^ 미천한 실력으로 만들다보니 역시 미흡해보이는게 눈에 너무 띠네요.

이팁을 보시는 여러분들은 어떠신가요?

코드자체를 직독직해?  가능하신지요?? 객체를 얼마나 자연스러운 코드로 만드시는지요?

영어잘하시는분 넘 부러워요!!

사용법          

  만약 ) this.textBox1.Text = "aa abbccc c d e11 ffffc a aabbbbbb 22b 4444 66";

 데이타가 존재시... 아래와 같이 중복을 제거할수 있습니다.

숫자 2는 2개씩 체크합니다.

            using (중복문자제거클래스 중복문자처리객체 = new 중복문자제거클래스(2))
            {
                this.textBox1.Text = 중복문자처리객체.제거실행(this.textBox1.Text);
            }

    public class 중복문자제거클래스 : IDisposable
        {
            int 체크문자개수 = 0;

            int 현재위치 = 0;
            List<char> 검사문자저장소 = new List<char>();
            List<string> 중복문자목록 = new List<string>();

            public 중복문자제거클래스(int _체크문자갯수)
            {
                체크문자개수 = _체크문자갯수;
            }

            public string 제거실행(string 검사소스문자열)
            {
                string 제거된문자열 = "";
                현재위치 = 0;
                for (int loop = 0; loop < 검사소스문자열.Length; loop++)
                {                   
                    char? 검색대상문자 = 검색대상문자얻어내기(검사소스문자열);
                    if (검색대상문자 != null)
                    {                     
                        bool 검사여부 = 문자체크여부(검색대상문자.Value);

                        if (검사여부 == false)
                        {
                            중복문자체크(검사소스문자열, 검색대상문자.Value);
                        }
                        현재위치++;
                    }
                    if (현재위치 >= 검사소스문자열.Length - 1)
                    {
                        제거된문자열 = 문자변환(검사소스문자열).Replace("  ", " ");
                    }
                }
                return 제거된문자열;
            }

            private string 문자변환(string 검사소스문자열)
            {
                foreach (string 중복문자항목 in 중복문자목록)
                {
                    검사소스문자열 = 검사소스문자열.Replace(중복문자항목, "");
                }
                return 검사소스문자열;
            }

            private void 중복문자체크(string 검사소스문자열, char 검사대상문자)
            {
                try
                {
                    string 중복검사문자열 = new string(검사대상문자, 체크문자개수);
                    if (검사소스문자열.IndexOf(중복검사문자열, 현재위치) >= 0)
                    {
                        중복문자목록.Add(중복검사문자열);
                    }
                }
                catch{ }
            }

            private bool 문자체크여부(char 검색대상문자)
            {
                bool 체크여부 = false;
                if (검사문자저장소.Contains(검색대상문자))
                {
                    체크여부 = true;
                }
                else
                {
                    체크여부 = false;
                    검사문자저장소.Add(검색대상문자);
                }
                return 체크여부;
            }

            private char? 검색대상문자얻어내기(string 검사소스문자열)
            {
                char? 검색대상문자 = null;
                try
                {
                    검색대상문자 = 검사소스문자열[현재위치];
                }
                catch { }
                return 검색대상문자;
            }

            #region IDisposable 멤버

            public void Dispose()
            {
                검사문자저장소.Clear();
                중복문자목록.Clear();
                중복문자목록 = null;
                검사문자저장소 = null;
            }

            #endregion
        }


아래 소스는 훈스게시판에 중복문자열을 찾아서 지우는 질문이 있었는데 

숫자타입만을 제거한다고 된걸 못보고 만들었다. 질문을 대충보는 버릇때문인지...

아래는 변수명을 억지로 한글로 바꾸어봤는데... 대충 대충 지었더니... 영어보다 더 보기 어렵다...

집에서 다시 고쳐보자!! 한글로 뭔가 객체지향느낌이 나도록....


    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.textBox1.Text = "aa a bb c d e ffff c a aa bbbbbb b";
        }

        public class 중복문자제거 : IDisposable
        {
            int 중복체크문자갯수 = 0;

            int 인덱스 = 0;
            List<char> 문자히스토리 = new List<char>();
            List<string> 중복문자 = new List<string>();

            public 중복문자제거(int 문자갯수 )
            {
                중복체크문자갯수 = 문자갯수;
            }

            public string 실행(string 문자열소스)
            {
                string 반환문자열 = "";
                인덱스 = 0;
                for (int loop = 0; loop < 문자열소스.Length; loop++)
                {
                    // 검색문자 뽑기 
                    char? c = 검색문자뽑기(문자열소스);
                    if (c != null)
                    {
                        // hist와 체크
                        bool b = 문자체크(c.Value);

                        if (b == false)
                        {
                            중복문자체크(문자열소스, c.Value);
                        }
                        인덱스++;
                    }
                    if (인덱스 >= 문자열소스.Length - 1)
                    {
                        반환문자열 = 문자변환(문자열소스).Replace("  ", " ");
                      
                    }
                }
                return 반환문자열;

            }

            private string 문자변환(string 문자열소스)
            {
                foreach (string s in 중복문자)
                {
                    문자열소스 = 문자열소스.Replace(s, "");
                }
                return 문자열소스;
            }

            private void 중복문자체크(string 문자열소스, char 체크문자)
            {
                try
                {
                    string s = new string(체크문자, 중복체크문자갯수);
                    if (문자열소스.IndexOf(s, 인덱스) >= 0)
                    {
                        중복문자.Add(s);
                    }
                }
                catch
                {}
            }

            private bool 문자체크(char c)
            {
                bool ret = false;
                if (문자히스토리.Contains(c))
                {
                    ret = true;
                }
                else
                {
                    ret = false;
                    문자히스토리.Add(c);
                }
                return ret;
            }

            private char? 검색문자뽑기(string 문자열소스)
            {
                char? 뽑기문자 = null;
                try
                {
                    뽑기문자 = 문자열소스[인덱스];
                }
                catch { }
                return 뽑기문자;
            }

            #region IDisposable 멤버

            public void Dispose()
            {
                문자히스토리.Clear();
                중복문자.Clear();
                중복문자 = null;
                문자히스토리 = null;
            }

            #endregion
        }


        private void button1_Click(object sender, EventArgs e)
        {
            using (중복문자제거 cc = new 중복문자제거(2))
            {
                this.textBox1.Text = cc.실행(this.textBox1.Text);
            }
        }
    }

DB Select했던것을 좀더 추가해서 구성한다. 

목적 : DebugForm활용법.
         GridView 바인딩 및 표시설정 방법
         UniList 소개.

디버그 활성화!
   JsFW.DEBUG.DebugQueryForm.SetDebugAuthority();
디버그 비즈 등록
  base.ShowDebugWindow(tb, this); // 디버그 창에 호출전 디버그 등록! 

끝... 넘 쉬운가?
디버그 창 뜬모습을 볼까낭


디버그 윈폼에 보면 사용한 쿼리 와 우측엔 파라미터가 나온다. 
아래는 해당 쿼리와 파라미터로 결과를 다시 쿼리 할수 있다.

파라미터를 사용시.. 쿼리 합성을 통해 쿼리를 파라미터와 치환도 가능하다.
또. 쿼리할때마다 쌓인다!


그리드 뷰
기본 그리드 뷰를 래핑한클래스로 프레임웍 내 표준 데이타 UniList로 데이타 I/O를 적용한 것임.
아래 보면 데이타 바인딩을 하고
컬럼을 지정해서 변경할수 있다.

            DataSet ds =   tb.List(null);
            gridView1.Bind(ds.Tables[0]);
            using (JsFW.Win.Controls.GridView_ColumnAtt att = new GridView_ColumnAtt())
            {
                att.Add(new GridView_ColumnInfo("object_id", "ID", 100f, DataGridViewContentAlignment.MiddleCenter));
                att.Add(new GridView_ColumnInfo("name", "프로시져명", 400f, DataGridViewContentAlignment.MiddleCenter));
                att.Setting( gridView1.SetColumnAtt ); // 대리자 등록.
                gridView1.SetConfig(true, true);
            }

gridView1.SetConfig(true, true); // 그리드 읽기전용,   Numbering

** 체크박스가 추가된 그리드, 그리드 두개짜리를 TwoGridView 가 존재한다 ( 추후에.. )

선택된 Row데이타 뽑기

            UniList selectData = gridView1.DataParameters;
            Alert( selectData.ToString("@name") );
            selectData.Clear();
            selectData = null;

** @name은 데이타의 Key로써  쿼리 파라미터로 바로 변환 되도록 정한 규칙이다.



전체 소스!!

  public partial class Form1 : BaseForm
    {
        Table_1 tb = new Table_1();

        public Form1()
        {
            InitializeComponent();

            this.NotifyIcon = Resources.Icon1;
            this.NotifyIcon_Visible = true;
            this.NotifyIcon_Menu = new ContextMenu();
            this.NotifyIcon_Menu.MenuItems.Add(new MenuItem("종료하기", delegate { this.Close(); }));

            JsFW.DEBUG.DebugQueryForm.SetDebugAuthority();

            gridView1.UniGriView_Click_Delegage += new UniGridView_Click(gridView1_UniGriView_Click_Delegage);
        }

        void gridView1_UniGriView_Click_Delegage()
        {
            // 그리드 클릭시..

            UniList selectData = gridView1.DataParameters;
            Alert( selectData.ToString("@name") );
            selectData.Clear();
            selectData = null;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Alert("하이! ", 10);
        }

        protected override void OnUniButton_Click(object sender, JsFW_ButtonEventArgs e)
        {
            base.OnUniButton_Click(sender, e);

            switch (e.Code)
            {
                case Button_Codes.등록: break;
                case Button_Codes.닫기: break;
                case Button_Codes.Special :
                    switch (e.Special)
                    {
                        case Button_Codes_Special.SpecialBtn1: break;
                        case Button_Codes_Special.없다: break;
                    }
                    break;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            base.ShowDebugWindow(tb, this); // 디버그 창에 호출전 디버그 등록!

            DataSet ds =   tb.List(null);
            gridView1.Bind(ds.Tables[0]);
            using (JsFW.Win.Controls.GridView_ColumnAtt att = new GridView_ColumnAtt())
            {
                att.Add(new GridView_ColumnInfo("object_id", "ID", 100f, DataGridViewContentAlignment.MiddleCenter));
                att.Add(new GridView_ColumnInfo("name", "프로시져명", 400f, DataGridViewContentAlignment.MiddleCenter));
                att.Setting( gridView1.SetColumnAtt ); // 대리자 등록.
                gridView1.SetConfig(true, true);
            }
        }
    }

    public class Table_1 : JsFW.ADONET.DataBase_Business
    {
        public override DataSet List(JsFW.BasicObjects.IUniDataParameter iDataPrms)
        {
            return ExcuteDataSet("Select * From sys.procedures", CommandType.Text, new System.Data.SqlClient.SqlParameter[0]);
        }
    }