TIL (60) | 2023.10.20 | 방어적 프로그래밍

kjg5370·2023년 10월 20일
0

TIL

목록 보기
59/91
post-thumbnail

들어가기 앞서

팀 프로젝트 발표를 통해 부족했던 부분을 알 수 있었습니다.
그 중에 방어적 프로그래밍을 적용하는 것이 좋아보인다는 조언을 받아 이것에대해 정리해보려고 합니다.

오늘 배운 것

  • 방어적 프로그래밍(Defensive Programming)
    소프트웨어를 개발할 때 발생할 수 있는 오류와 버그를 최소화하고, 프로그램의 안정성을 향상시키기 위한 접근 방식.

  • 사용 예

    • 입력 유효성 검사: 사용자가 이름을 입력하는 곳에 길이가 만단 위 넘는 문자열을 입력하는 상황을 방지하기 위해, 입력 데이터를 검사하는 코드를 작성합니다. 이렇게 하면 프로그램이 사용자의 잘못된 입력에 대비할 수 있습니다.

    • 예외 상황 처리: 주문 버튼을 여러 번 클릭하여 중복 주문이 발생하는 상황을 방지하기 위해, 주문 완료 후 뒤로가기로 중복 주문을 방지하는 코드를 작성합니다. 이렇게 하면 예기치 못한 상황에 대비할 수 있습니다.

    • 유효성 확인: null 값 또는 잘못된 값이 발생하는 상황에 대비하여, 입력 데이터나 변수에 유효성 확인을 추가합니다. 이로써 프로그램이 안정적으로 실행될 수 있습니다.

  • 유니티 예시
    게임 내에서 플레이어의 체력을 관리하고 예상치 못한 문제로부터 코드를 보호하는 방법

    using UnityEngine;
    
    public class PlayerHealth : MonoBehaviour
    {
        public int maxHealth = 100;
        private int currentHealth;
    
        void Start()
        {
            currentHealth = maxHealth;
        }
    
        public void TakeDamage(int damage)
        {
            if (damage < 0)
            {
                Debug.LogWarning("Negative damage values are not allowed.");
                return; // 방어적 프로그래밍: 음수 데미지를 허용하지 않음
            }
    
            currentHealth -= damage;
    
            if (currentHealth <= 0)
            {
                Die();
            }
        }
    
        public void Heal(int healAmount)
        {
            if (healAmount < 0)
            {
                Debug.LogWarning("Negative healing values are not allowed.");
                return; // 방어적 프로그래밍: 음수 치유량을 허용하지 않음
            }
    
            currentHealth += healAmount;
    
            if (currentHealth > maxHealth)
            {
                currentHealth = maxHealth;
            }
        }
    
        private void Die()
        {
            // 플레이어 캐릭터가 죽었을 때의 처리
        }
    }

기억 할 것

  • 방어적 프로그래밍을 위해 고려해야 하는 다양한 문제와 접근 방법
  1. 외부 소스나 매개변수로 받는 값:

    • 입력 데이터 유효성 검사: 외부에서 받는 데이터가 올바른 범위 내에 있는지, 올바른 데이터 유형인지 확인합니다.
      예를 들어, 날짜 값이 특정 범위 내에 있는지, 데이터가 null이 아니면서 문자열인지 확인합니다.
  2. 공유 메모리 또는 스레드:

    • 레이스 컨디션 방지: 공유 메모리나 다중 스레드 환경에서 데드락이나 의도치 않은 데이터 간섭을 방지합니다.
  3. 변수 활용: 간섭 및 범위:

    • 변수 범위 관리: 전역 변수와 지역 변수 간의 충돌을 피하기 위해 변수 범위를 최소화합니다.
  4. 개발자 규칙:

    • 일찍 실패하고 자주 실패하기: 오류를 빨리 발견하고, 자주 실패함으로써 문제 해결을 더 빠르게 할 수 있습니다.
    • 버그를 가정문과 테스트로 변환하기: 버그를 예상하고 이를 테스트 케이스로 만들어 방지하며, 코드 변경 시 오류 재발을 방지합니다.
  5. 테스트 주도 개발 (TDD):

    • 방어적 프로그래밍의 중요한 부분 중 하나로, 코드를 작성하기 전에 테스트 케이스를 먼저 작성합니다. 이로써 코드의 안정성을 높이고 예상치 못한 오류를 미리 방지할 수 있습니다.

내일 할 일

  • 졸업작품 기능 마무리
profile
학생입니다

0개의 댓글