1. 접근 범위는 최대한 좁게
외부에서 접근할 일 없는 건 private, 자식 클래스가 사용할 거면 protected, 아니면 public.
가능한 한 접근 제한은 빡빡하게 해 준다. 이거는 OOP의 기본이므로 특별할 건 없다.
2. public 필드는 되도록이면 Property로
외부에서 접근 가능한 필드는 항상 값이 변경될 가능성이 열려있으므로 이것을 통제할 수단이 필요하다.
그래서 되도록이면 Property로 선언해서 setter의 접근 범위를 지정해 준다.
// 외부에서 접근 가능하지만 수정은 불가능.
public Health { get; private set; }
3. 유니티 인스펙터에 노출시키고 싶을 경우 [SerializeField]
인스펙터에 노출시키고 싶은데 외부에서 접근할 필요는 없어서 굳이 public으로 선언하고 싶지 않을 때가 많다.
그럴 땐 private으로 하고 [SerializeField] 어트리뷰트를 붙여준다.
이러면 인스펙터에 노출되는 것과 그렇지 않은 것들을 명확하게 구분할 수 있는 장점도 있다.
[SerializeField]
private GameObject _prefab;
[SerializeField]
private float _speed;
4. 값이 변하지 않을 경우 readonly
readonly 키워드는 해당 필드를 '선언시, 또는 생성자에서 한 번 초기화된 후에는 수정이 불가능' 하게 만든다.
그렇기 때문에 값이 변하지 않는 필드마다 readonly를 붙여주면 문법적으로도 신뢰성이 높아지고
값이 변하지 않는다는 것을 명시할 수 있어서 좋다.
// 리스트의 내용물들은 변하지만 리스트 인스턴스 자체는 변하지 않는다.
public readonly List mobs = new List();
5. 예시
전에 작성했던 코드들 중에서 아무거나 짚이는대로 가져와 보았다.
위에 나열한 습관이 모든 경우를 다 커버하지는 않지만 대체로 이렇게 보기좋게 정리되는 편.
[SerializeField]
private YukaNetView _view;
[SerializeField]
private NetworkPlayerManager _playerManager;
[SerializeField]
private TextAsset _configFile;
private readonly Queue _operationQueue = new Queue();
public ServerConfig config { get; private set; }
public NetworkPlayerManager playerManager { get { return _playerManager; } }
public List playerList { get { return playerManager.playerList; } }
public int playerCount { get { return playerList.Count; } }
public NetworkPlayer myPlayerInstance { get { return playerManager.myPlayerInstance; } }
public string ip { get; private set; }
public int port { get; private set; }
'Unity3D 팁' 카테고리의 다른 글
Unity Command Terminal 유니티 오픈소스 개발자콘솔 (0) | 2019.01.07 |
---|---|
Facepunch.Steamworks 더 쉬운 스팀 라이브러리 (0) | 2019.01.07 |
유니티로 콘솔 어플리케이션 만들기 (0) | 2018.10.23 |