2016년 5월 16일 월요일

C# 네이밍 정책에 대한 정리

http://www.dofactory.com/reference/csharp-coding-standards

위의 링크에서 설명하는

C# 표준 코딩 과 올바른 네이밍 기법에 대한 정리를 번역하여 정리함

권장! 메서드 네이밍은 파스칼케싱(PascalCasing)으로 사용
  1. public class ClientActivity
  2. {
  3. public void ClearStatistics()
  4. {
  5. //...
  6. }
  7. public void CalculateStatistics()
  8. {
  9. //...
  10. }
  11. }
이유 :  마이크로소프트의 .NET 프레임워크 형식과 일치하고 읽기도 쉬움
//파스칼케싱이란 대문자로 시작하며 복합어일 경우 단어가 시작될 때 마다 대문자로 시작.

권장! 매개변수나 로컬변수의 네이밍은 카멜케싱(camelCasing)으로 사용
  1. public class UserLog
  2. {
  3. public void Add(LogEvent logEvent)
  4. {
  5. int itemCount = logEvent.Items.Count;
  6. // ...
  7. }
  8. }
이유 : 마이크로소프트의 .NET 프레임워크 형식과 일치하고 읽기도 쉬움
//카멜케싱이란 소문자로 시작하며 복합어일 경우 단어가 시작될 때 마다 대문자로 시작.

금지! 헝가리안 표기법의 사용 과 변수에 타입식별자 정보를 포함
  1. // Correct
  2. int counter;
  3. string name;
  4. // Avoid
  5. int iCounter;
  6. string strName;
이유 : 마이크로소프트의 .NET 프레임워크와 VS IDE 는 (툴팁을 통해) 타입을 매우 간단하게 알 수 있다.
일반적으로 다른 식별자를 통한 유형 지표를 피하고자 함.


금지! 상수 또는 읽기 전용 변수에 Screaming Caps(대문자열거) 사용
  1. // Correct
  2. public static const string ShippingType = "DropShip";
  3. // Avoid
  4. public static const string SHIPPINGTYPE = "DropShip";
이유 : 마이크로 소프트의 .NET 프레임워크 형식과 일치하고 있다. 너무 많은 관심을 끈다.

권장하지 않음! 약어를 사용. 예외 : Id, Xml, Ftp, Uri 같은 일반 명칭으로 사용되는 약어
  1. // Correct
  2. UserGroup userGroup;
  3. Assignment employeeAssignment;
  4. // Avoid
  5. UserGroup usrGrp;
  6. Assignment empAssignment;
  7. // Exceptions
  8. CustomerId customerId;
  9. XmlDocument xmlDocument;
  10. FtpHelper ftpHelper;
  11. UriPart uriPart;
이유 : 마이크로 소프트 .NET 프레임워크의 일관성과 일치하지 않는 약어를 방지할 수 있다.

권장! 3자 이상의 약어는 파스칼케싱을 사용(2자의 경우 모두 대문자)
  1. HtmlHelper htmlHelper;
  2. FtpTransfer ftpTransfer;
  3. UIControl uiControl;

이유 : 마이크로 소프트의 .NET 프레임워크 형식과 일치하고 있다. 너무 많은 관심을 끈다.

금지! 식별자에 밑줄을 사용, 예외 : private 정적 변수에는 넣을 수 있음.
  1. // Correct
  2. public DateTime clientAppointment;
  3. public TimeSpan timeLeft;
  4. // Avoid
  5. public DateTime client_Appointment;
  6. public TimeSpan time_Left;
  7. // Exception
  8. private DateTime _registrationDate;
이유 : 마이크로소프트 .NET 프레임워크에서 일관성이 있고(밑줄 없이) 더 자연스럽게 코드를 읽을 수 있음.
또한 언더라인 스트레스(언더라인을 볼 수 없음)를 방지할 수 있음.

권장! 시스템 타입의 이름(Int16, Single, UInt64, 등) 대신 미리 정의된 타입을 사용
  1. // Correct
  2. string firstName;
  3. int lastIndex;
  4. bool isSaved;
  5. // Avoid
  6. String firstName;
  7. Int32 lastIndex;
  8. Boolean isSaved;
이유 : 마이크로소프트 .NET 프레임워크에서 일관성있고 코드를 더 자연스럽게 읽을 수 있습니다.

권장! 지역변수의 경우 VAR(암시적 형) 형을 사용. 예외 : 기본유형(int, string, double, 등)은 미리 정의된 이름을 사용.
  1. var stream = File.Create(path);
  2. var customers = new Dictionary();
  3. // Exceptions
  4. int index = 100;
  5. string timeSheet;
  6. bool isCompleted;
이유 : 비교적 복잡한 유형에 대한 혼란을 제거합니다. Viual Studio에서 도구 칩을 통해 쉽게 검출됩니다.

권장! 클래스 이름을 명사 또는 명사구를 사용
  1. public class Employee
  2. {
  3. }
  4. public class BusinessLocation
  5. {
  6. }
  7. public class DocumentCollection
  8. {
  9. }
이유 : 마이크로소프트 .NET 프레임워크에서 일관성 있고 기억하기 쉽다.

권장! 인터페이스에는 접두사 I를 붙임. 인터페이스 이름은 명사(구) 또는 형용사 사용.
  1. public interface IShape
  2. {
  3. }
  4. public interface IShapeCollection
  5. {
  6. }
  7. public interface IGroupable
  8. {
  9. }
이유 : 마이크로소프트 .NET 프레임워크 정책과 일치

권장! 소스파일의 이름은 메인클래스의 이름으로 함. 예외 : 부분 클래스의 파일이름(예를 들어 코드의 목적을 반영, 디자이너, 생성, 등)
  1. // Located in Task.cs
  2. public partial class Task
  3. {
  4. //...
  5. }
  1. // Located in Task.generated.cs
  2. public partial class Task
  3. {
  4. //...
  5. }
이유 : 마이크로소프트 관행과 일치. 파일은 알파벳 순으로 정렬하고, 부분 클래스 인접은 남아있다.

권장! 명확하게 정의된 구조를 가지는 네임스페이스를 구성
  1. // Examples
  2. namespace Company.Product.Module.SubModule
  3. namespace Product.Module.Component
  4. namespace Product.Layer.Module.Group
이유 : 마이크로소프트 .NET 프레임워크 정책과 일치. 당신의 코드베이스에서 좋은 구성을 유지함.

권장! 수직 중괄호를 맞춤.
  1. // Correct
  2. class Program
  3. {
  4. static void Main(string[] args)
  5. {
  6. }
  7. }
이유 : 마이크로소프트는 다른 기준을 가지고 있지만, 개발자가 압도적으로 수직 중괄호를 선호.

권장! 클래스 상단에 모든 멤버변수를 선언, 스테틱 변수는 최상단에 선언
  1. // Correct
  2. public class Account
  3. {
  4. public static string BankName;
  5. public static decimal Reserves;
  6. public string Number {get; set;}
  7. public DateTime DateOpened {get; set;}
  8. public DateTime DateClosed {get; set;}
  9. public decimal Balance {get; set;}
  10. // Constructor
  11. public Account()
  12. {
  13. // ...
  14. }
  15. }
이유 : 일반적으로 변수 선언을 찾아 다닐 필요가 없게됨.

권장! 열거형은 단수 이름을 사용. 예외 : 비트 필드 열거
  1. // Correct
  2. public enum Color
  3. {
  4. Red,
  5. Green,
  6. Blue,
  7. Yellow,
  8. Magenta,
  9. Cyan
  10. }
  11. // Exception
  12. [Flags]
  13. public enum Dockings
  14. {
  15. None = 0,
  16. Top = 1,
  17. Right = 2,
  18. Bottom = 4,
  19. Left = 8
  20. }
이유: 마이크로소프트 .NET 프레임워크에서 일관적이고 자연스럽게 코드를 읽을 수 있음. 
복수 플래그 열거가(비트 or을 사용하여) 여러 값을 저장할 수 있기 때문.

금지! 명시적으로(비트 필드 제외) 열거형의 유형이나 값을 지정
  1. // Don't
  2. public enum Direction : long
  3. {
  4. North = 1,
  5. East = 2,
  6. South = 3,
  7. West = 4
  8. }
  9. // Correct
  10. public enum Direction
  11. {
  12. North,
  13. East,
  14. South,
  15. West
  16. }
이유 : 실제 유형이 아닌 값에 의존할때 혼란스러울 수 있음.

금지! 열거형 이름에 Enum을 포함
  1. // Don't
  2. public enum CoinEnum
  3. {
  4. Penny,
  5. Nickel,
  6. Dime,
  7. Quarter,
  8. Dollar
  9. }
  10. // Correct
  11. public enum Coin
  12. {
  13. Penny,
  14. Nickel,
  15. Dime,
  16. Quarter,
  17. Dollar
  18. }
이유 : 마이크로소프트의 .NET 프레임 워크와 일치하고 식별자에 어떤 유형 지표의 사전 규칙과 일치



2016년 5월 6일 금요일

Attempting to call method 'System.Reflection.MonoProperty::GetterAdapterFrame' for which no ahead of time (AOT) code was generated.

서비스중인 앱의 새로운 버전을 iOS로 스위칭 하고 빌드하여 실행 시키는 도중에 이슈가 발생했다.

Attempting to call method 'System.Reflection.MonoProperty::GetterAdapterFrame' for which no ahead of time (AOT) code was generated.

런타임으로 발생한 이 애러는

시스템 제너릭에 라이버러리에 포함된 xml serializer 를 사용중에 발생하였다.

관련코드는 이전 버전과 같았는데 이러한 문제가 발생해

관련 키워드로 검색하고 이리저리 삽질을 진행

결론은 싱겁게도 Unity3d 의 iOS셋팅이 잘못 되엇던 것이였다.

Api Compatibility Level 을 .NET 2.0 Subset으로 변경하여 해결하였다.

이 문제를 해결하기 위해 방문했던 링크

http://forum.unity3d.com/threads/please-help-for-il2cpp-problem.302670/

http://devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=52443&sfl=wr_subject%7C%7Cwr_content&stx=AOT&sop=and

http://docs.unity3d.com/Manual/iphone-playerSizeOptimization.html

http://answers.unity3d.com/questions/30930/why-did-my-binaryserialzer-stop-working.html

http://answers.unity3d.com/questions/406242/serialize-on-ios-that-is-aot-safe.html

http://answers.unity3d.com/questions/1089649/ios-xml-serialization-jit-exception.html

ios could not find developer disk image

iOS 를 최신으로 업데이트 하고

Xcode 에서 빌드하려는 찰나

ios could not find developer disk image 라는 메세지가 출력되며 빌드가 불가능 해짐

Xcode 가 새로운 iOS를 지원하지 않아서 발생한 문제로 보임

문제는 MAC OS 버전이 오래되어 Xcode 업데이트가 불가능한 상황

MAC OS 업데이트를 진행 후 Xcode 업데이트 가능 여부를 확인해야함.