단일 책임 원칙(Single responsibility principle)
- 모든 클래스는 하나의 책임만 가짐
- 클래스는 그 책임을 완전히 캡슐화해야 함
- 클래스가 제공하는 모든 기능은 이 책임과 부합
Readability(가독성) : 짧은 클래스가 읽기 쉬움
Extensibility(확장성) : 작은 클래스로부터 상속이 쉬움
Reusability(재사용성) : 부분에서 재사용할 수 있도록 작고 모듈식으로 설계
그림을 통해 단일 책임 원칙을 적용 전과 후의 구조 차이를 확인해 보자
// 단일 책임 원칙을 적용하지 않은 코드
public class UnrefactoredPlayer : MonoBehaviour
{
[SerializeField] private string inputAxisName;
[SerializeField] private float positionMultiplier;
public float yPosition;
private AudioSource bounceSfx;
private void Start()
{
bounceSfx = GetComponent<AudioSource>();
}
private void Update()
{
float delta = Input.GetAxis(inputAxisName) * Time.deltaTime;
yPosition = Mathf.Clamp(yPosition + delta, -1, 1);
transform.position = new Vector3(transform.position.X, yPosition * positionMultiplier, transform.position.z);
}
private void OnTriggerEnter(Collider other)
{
bounceSfx.Play();
}
}
이제 다음 코드는 위 코드의 내용을 가지고 단일 책임 원칙을 적용해 본 코드이다.
[RequireComponent(typeof(PlayerAudio), typeof(PlayerInput), typeof(PlayerMovement))]
public class Player : MonoBehaviour
{
[SerializeField] private PlayerAudio playerAudio;
[SerializeField] private PlayerInput playerInput;
[SerializeField] private PlayerMovement playerMovement;
private void Start()
{
playerAudio = GetComponent<PlayerAudio>();
playerInput = GetComponent<PlayerInput>();
playerMovement = GetComponent<PlayerMovement>();
}
}
public class PlayerAudio : MonoBehaviour
{
// 플레이어의 사운드에 관한 설정
}
public class PlayerInput : MonoBehaviour
{
// 플레이어의 입력의 관한 설정
}
public class PlayerMovement : MonoBehaviour
{
// 플레이어의 이동에 관한 설정
}