1. 프로그래머의 직업

매우 자주 초보 프로그래머는 프로그래머의 작업을 숙련된 프로그래머가 생각하는 것과 완전히 다르게 생각합니다.

초보자는 종종 "프로그램이 작동합니다. 다른 무엇이 필요합니까? "와 같은 말을합니다. 숙련된 프로그래머는 "올바르게 작동"하는 것이 프로그램의 요구 사항 중 하나일 뿐이며 가장 중요한 것도 아니라는 것을 알고 있습니다 !

코드 가독성

가장 중요한 것은 프로그램 코드가 다른 프로그래머가 이해할 수 있다는 것입니다 . 이것은 올바르게 작동하는 프로그램보다 더 중요합니다. 훨씬 더.

제대로 작동하지 않는 프로그램이 있으면 수정할 수 있습니다. 그러나 코드를 이해할 수 없는 프로그램이 있으면 아무 것도 할 수 없습니다.

메모장과 같은 컴파일된 프로그램을 선택하고 배경색을 빨간색으로 변경하십시오. 작동하는 프로그램이 있지만 이해할 수 있는 소스 코드가 없습니다. 그런 프로그램을 변경하는 것은 불가능합니다.

교과서적인 예는 Microsoft 개발자가 핀볼 게임을 64비트 아키텍처로 이식할 수 없었기 때문에 Windows에서 제거한 경우입니다. 그리고 그들은 심지어 소스 코드를 가지고 있었습니다. 그들은 단순히 코드가 어떻게 작동하는지 이해할 수 없었습니다 .

모든 사용 사례에 대한 회계

프로그램에 대한 두 번째로 중요한 요구 사항은 모든 시나리오를 설명하는 것입니다. 종종 상황은 보이는 것보다 조금 더 복잡합니다.

초보 프로그래머가 SMS 메시지 전송을 보는 방법:

올바르게 작동하는 프로그램

전문 프로그래머가 보는 관점:

올바르게 작동하는 프로그램

"올바르게 작동"하는 시나리오는 일반적으로 가능한 많은 시나리오 중 하나에 불과합니다. 이것이 많은 초보자들이 CodeGym의 작업 유효성 검사기에 대해 불평하는 이유입니다. 10개의 시나리오 중 하나의 시나리오만 작동하고 초보자 프로그래머는 충분하다고 생각합니다.


2. 비정상적인 상황

비정상적인 상황

프로그램 실행 시 비정상적인 상황이 발생할 수 있습니다.

예를 들어 파일을 저장하기로 결정했지만 디스크 공간이 없습니다. 또는 프로그램이 메모리에 데이터를 쓰려고 하지만 사용 가능한 메모리가 부족합니다. 또는 인터넷에서 사진을 다운로드했지만 다운로드 과정에서 연결이 끊어졌습니다.

각각의 비정상적인 상황에 대해 프로그래머(프로그램 작성자)는 a) 이를 예상하고 , b) 프로그램이 이를 정확히 어떻게 처리해야 하는지 결정 하고, c) 원하는 것에 가능한 한 근접한 솔루션을 작성해야 합니다.

그렇기 때문에 프로그램은 꽤 오랜 시간 동안 매우 간단한 동작을 수행했습니다. 프로그램에서 오류가 발생하면 프로그램이 종료되었습니다. 그리고 그것은 꽤 좋은 접근 방식이었습니다.

문서를 디스크에 저장하려고 하는데 저장 프로세스 중에 디스크 공간이 충분하지 않다는 것을 발견했다고 가정해 보겠습니다. 어떤 행동을 가장 원하십니까?

  • 프로그램이 종료됩니다
  • 프로그램은 계속 실행되지만 파일은 저장되지 않습니다.

초보 프로그래머는 프로그램이 아직 실행 중이기 때문에 두 번째 옵션이 더 낫다고 생각할 수 있습니다. 그러나 실제로는 그렇지 않습니다.

Word에서 3시간 동안 문서를 입력했지만 쓰기 프로세스가 시작된 지 2분 만에 프로그램이 문서를 디스크에 저장할 수 없다는 것이 분명해졌다고 상상해 보십시오. 2분이나 3시간을 낭비하는 것이 더 낫습니까?

프로그램이 필요한 작업을 수행할 수 없는 경우 계속해서 모든 것이 괜찮은 척하는 것보다 프로그램을 종료하는 것이 좋습니다. 자체적으로 해결할 수 없는 오류가 발생했을 때 프로그램이 할 수 있는 최선의 방법은 문제를 사용자에게 즉시 보고하는 것입니다.


3. 예외에 대한 배경

비정상적인 상황에 직면하는 것은 프로그램만이 아니다. 그들은 또한 프로그램 내부에서, 즉 메소드에서 발생합니다. 예를 들어:

  • 메소드가 디스크에 파일을 쓰려고 하지만 공간이 없습니다.
  • 메서드가 변수에 대한 함수를 호출하려고 하지만 변수가 null입니다.
  • 0으로 나누기는 메서드에서 발생합니다.

이 경우 호출 메서드는 호출된 메서드에서 어떤 종류의 문제가 발생했는지 알면 상황을 수정(대체 시나리오 실행)할 수 있습니다.

파일을 디스크에 저장하려고 하는데 해당 파일이 이미 존재하는 경우 사용자에게 파일을 덮어써야 하는지 확인하도록 간단히 요청할 수 있습니다. 사용 가능한 디스크 공간이 없는 경우 사용자에게 메시지를 표시하고 사용자에게 다른 디스크를 선택하도록 요청할 수 있습니다. 그러나 프로그램의 메모리가 부족하면 충돌이 발생합니다.

옛날 옛적에 프로그래머는 이 질문에 대해 숙고하고 다음과 같은 해결책을 내놓았습니다. 모든 메서드/함수는 실행 결과를 나타내는 오류 코드를 반환해야 합니다. 함수가 완벽하게 작동하면 0 을 반환합니다 . 그렇지 않은 경우 오류 코드 (0이 아님)를 반환했습니다 .

오류에 대한 이러한 접근 방식을 사용하면 거의 모든 함수 호출 후 프로그래머가 함수가 오류로 종료되었는지 확인하는 검사를 추가해야 했습니다. 코드의 크기가 커져 다음과 같이 생겼습니다.

오류 처리가 없는 코드 오류 처리가 있는 코드
File file = new File("ca:\\note.txt");
file.writeLine("Text");
file.close();
File file = new File("ca:\\note.txt");
int status = file.writeLine("Text");
if (status == 1)
{
   ...
}
else if (status == 2)
{
   ...
}
status = file.close();
if (status == 3)
{
   ...
}

게다가 오류가 발생했음을 발견한 함수는 이를 어떻게 처리해야 할지 몰랐습니다. 호출자는 오류를 반환해야 하고 호출자의 호출자는 오류를 호출자에게 반환해야 했습니다.

대규모 프로그램에서는 수십 개의 함수 호출 체인이 일반적입니다. 때로는 수백 개의 함수 호출 깊이를 찾을 수도 있습니다. 이제 맨 아래에서 맨 위로 오류 코드를 전달해야 합니다. 그리고 어떤 함수가 종료 코드를 처리하지 않는 도중 어딘가에 있으면 오류가 손실됩니다.

이 접근 방식의 또 다른 단점은 함수가 오류 코드를 반환하면 더 이상 자체 작업 결과를 반환할 수 없다는 것입니다. 계산 결과는 참조 매개변수를 통해 전달되어야 했습니다. 이것은 코드를 더욱 복잡하게 만들었고 오류의 수를 더욱 증가시켰습니다.