깃허브의 소스를 보다가 이렇게 작성하면 좋았을 텐데 하는 부분이 있다.
코드를 볼 때 직관적으로 파악이 안된 부분이다.
다음 출처의 코드를 이야기 해보고자 한다.
출처 : 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++ 분위기가 나는 것 같기도 하지만 어느 정도 만족스럽다.
좀 더 진행하자면 위의 유일한 코멘트가 과연 필요한가 의문이지만 일단은 여기까지.
'Tech' 카테고리의 다른 글
다양한 LBP 소스가 있는 깃허브 레포지토리 (0) | 2018.07.27 |
---|---|
코드 정리 #3 (0) | 2018.07.27 |
코드 정리 #1 (0) | 2018.07.25 |
[기초] C/C++ 에서 에러를 최소화하는 코딩 법 (0) | 2018.07.25 |
기본 Base64의 urlsafe 한 변형 버전이 있다. (0) | 2018.07.25 |