NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# C# .NET 매크로 프로그램 만들기. (배열에 데이터를 추가할 수 있는 기능)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 요즘은 별수와 배열에 관련된 기능들을 계속 추가하고 있는데요. 배열은 1차원이 기본이지만, 다차원 배열도 처리할 수 있어야하기 때문에 어떻게 쉽게 사용할 수 있도록 디자인해야 할지 고민이 많습니다. 그리고, 배열도 상황에 따라서 종류가 많은데다가 스레드에 안전한 방식으로 처리할 수 있는지에 따라서 동기화할지 비동기로 처리할지도 선택해야 합니다.

     

    하지만, GUI로 이런 모든 것들을 사용자가 직접 설정하는건 너무 많은 옵션을 제공해야 하고 복잡도가 정말 많이 올라갈겁니다. 그래서, 어느정도 기능에 제약을 둬서 쉽고 간단하게 사용하도록 유도하는게 좋을거 같아요. 그렇더라도 기능에 제약이 있으면 어떤 특수한 상황에 유연하게 대처하기가 어렵기 때문에 방법을 찾아보고 있는 중입니다. 일단은 1차원 배열을 처리할 수 있는 기능을 제공하고 이 후에 확장할 수 있는 플러그인이나 커스텀을 제공하는게 좋을듯 합니다. 고민이 많이 필요한 부분이라서 지금 당장 어떤 해답을 찾기엔 어려울거 같아요.

     

    아래와 같이 배열을 처리할 수 있는 액션을 추가했습니다. 변수 추가, 변수 삭제, 변수 정렬입니다. 변수로부터 데이터를 가져오는 변수 선택도 필요한데요. 이건 다음에 알아볼께요.

    xkfrt8w.jpeg

     

     

    변수 추가 액션에서 기본적으로 제공해야 할 속성들이 뭘까 고민하다가 아래와 같이 정의를 했습니다.

    public class ArrayAddModel : BaseModel
    {
        [NonSerialized]
        private string[]? _datas;
    
        [LocalizedCategory("Data")]
        [LocalizedDisplayName("Result")]
        [LocalizedDescription("Result")]
        [Browsable(true)]
        [DefaultValue(null)]
        public string[]? Result { get; set; }
    
        [LocalizedCategory("Array")]
        [LocalizedDisplayName("RepeatData")]
        [LocalizedDescription("RepeatData")]
        [Browsable(true)]
        [DefaultValue(null)]
        public string[]? ArrayData { get { return _datas; } set { _datas = value; } }
    
        [LocalizedCategory("Action")]
        [LocalizedDisplayName("AddValues")]
        [LocalizedDescription("AddValues")]
        [Browsable(true)]
        [DefaultValue(null)]
        [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
        public string? AddValues { get; set; }
    
        [LocalizedCategory("Array")]
        [LocalizedDisplayName("ArrayAddLocation")]
        [LocalizedDescription("ArrayAddLocation")]
        [Browsable(true)]
        [DefaultValue(typeof(Ai.Definition.FindOption), "Last")]
        public Ai.Definition.FindOption AddLocation { get; set; } = Definition.FindOption.Last;
    
        [LocalizedCategory("Array")]
        [LocalizedDisplayName("ArrayIndex")]
        [LocalizedDescription("ArrayIndex")]
        [Browsable(true)]
        [DefaultValue(0)]
        public int Index { get; set; }

     

     

    지금까지 개발 관련된 내용을 꾸준히 봐오신 분들은 대충 보더라도 어떤 내용인지 아마 감을 잡으실거 같아요. 여기서 중요한 내용은 AddLocation 속성인데요. 어떤 동작을 수행할지 결정하는 옵션입니다. 이 옵션은 아래와 같이 3가지 행동을 제공합니다. 사용자가 배열로 추가하고 싶은 항목을 첫번째 위치 또는 마지막 위치에 추가합니다. 만약, 특정 위치에 추가하고 싶으면 인덱스를 사용하면 됩니다.

    public enum FindOption
    {
        First = 0,
        Last = 1,
        Index = 2
    }

     

    구현부도 간단합니다. 아마도 배열 관련해서는 코드들이 전부 간단할거 같아요. 1차원 배열이라서 딕셔너리와 같은 Key, Value 형태를 처리할 수 있는 로직은 아직까지 필요하진 않은데요. 딕셔너리 배열을 처리할 때 코드도 복잡해질거 같아요. 디자인을 어떻게 하느냐에 따라서 달라질듯 하지만요.

     

    아래는 전체 구현 내용입니다.

    public override string? Execute(IPlayer player)
    {
        var id = base.Execute(player);
        List<string>? datas = _datas.ToList();
    
        string[] av = AddValues.Replace(Environment.NewLine, "\\n").Split("\\n");
    
        switch (AddLocation)
        {
            case Definition.FindOption.First:
                datas.InsertRange(0, av);
                break;
            case Definition.FindOption.Last:
                datas.AddRange(av);
                break;
            case Definition.FindOption.Index:
                datas.InsertRange(Index, av);
                break;
        }
    
        Result = datas.ToArray();
    
        return id;
    }

     

    배열에 내용을 추가하는 기능을 다 만들었습니다. 지금까지 만들었던 액션들 중에서 가장 간단했던거 같아요. 아직 다 만든건 아니지만요. 이제 테스트를 해볼까요?

     

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.