본문 바로가기

Tech

코드 정리 #2

깃허브의 소스를 보다가 이렇게 작성하면 좋았을 텐데 하는 부분이 있다.

코드를 볼 때 직관적으로 파악이 안된 부분이다.

 

다음 출처의 코드를 이야기 해보고자 한다.

 

출처 : https://github.com/shimat/opencvsharp/blob/master/src/OpenCvSharp/Vector/VectorOfByte.cs

 

 

    /// <SUMMARY>
    /// 
    /// <SUMMARY>
    public class VectorOfByte : DisposableCvObject, IStdVector
    {
        /// <SUMMARY>
        /// 
        /// <SUMMARY>
        public VectorOfByte()
        {
            ptr = NativeMethods.vector_uchar_new1();
        }

 

먼저 가볍게 하나 짚고 넘어가자면 일관된 코멘트 구조는 눈여겨 볼만하다.

다만 좀더 간결하게 작성할 수 있지 않았을까 하는 아쉬움이 있다.

 

 

        public byte[] ToArray()
        {
            int size = Size;
            if (size == 0)
            {
                return new byte[0];
            }
            byte[] dst = new byte[size];
            Marshal.Copy(ElemPtr, dst, 0, dst.Length);
            GC.KeepAlive(this); // ElemPtr is IntPtr to memory held by this object, so
                                // make sure we are not disposed until finished with copy.
            return dst;
        }

 

 

처음에 위 코드를 보고 약간 혼동이 왔다.

바로 size = Size 코드 때문인데 Size가 뭔지 직관적으로 파악이 안된다.

원본 위쪽 코드를 보면 Size를 지정하는 부분이 있지만 좀 더 깔끔히 코딩할 수 있지 않을까 싶다.

내 지론은 네이밍은 그것만으로도 많은 것을 파악할 수 있어야 한다는 것이다.

그래서 다음과 같이 바꿔 보았다.

 

        public byte[] ToArray()
        {
            int size   = m_nSize;
            byte[] dst = new byte[size];


            if (size == 0)     return dst;
            
            Marshal.Copy(ElemPtr, dst, 0, dst.Length);
            GC.KeepAlive(this); // ElemPtr is IntPtr to memory held by this object, so
                                // make sure we are not disposed until finished with copy.
            return dst;
        }

 

1차로 네이밍을 변경하고 데이터와 로직을 분리해 봤는데 return 이 거슬린다.

중간에 return이 중구난방으로 많아질 경우 디버깅 시 피곤해지기 때문이다.

그래서 로직 구조를 변경해 보았다.

 

        public byte[] ToArray()
        {
            int size   = m_nSize;
            byte[] dst = new byte[size];


            if (size > 0)
            {
                Marshal.Copy(ElemPtr, dst, 0, dst.Length);
                GC.KeepAlive(this); // ElemPtr is IntPtr to memory held by this object, so
                                    // make sure we are not disposed until finished with copy.
            }

            return dst;
        }

 

C# 코드가 C++ 분위기가 나는 것 같기도 하지만 어느 정도 만족스럽다.

좀 더 진행하자면 위의 유일한 코멘트가 과연 필요한가 의문이지만 일단은 여기까지.