기본값-좋고 나쁘니?


12

일반적으로 기본값에 대한 질문-기본 반환 함수 값, 기본 매개 변수 값, 누락 된 경우의 기본 논리, 예외 처리를위한 기본 논리, 에지 조건을 처리하기위한 기본 논리 등

오랫동안 나는 기본값을 "순수한 악의", "재앙을 은폐"하고 버그를 찾기가 매우 어려운 것으로 생각했습니다. 그러나 최근에 나는 기본값을 일종의 기술 부채로 생각하기 시작했습니다 ... 이것은 똑바로 나쁜 것은 아니지만 어떤 "단기 금융"을 제공 할 수있는 것은 우리가 프로젝트에서 살아남을 수있게 해줍니다 (우리 중 몇 명이 감당할 수 있습니까? 주택 담보 대출을받지 않고 집을 사려면?).

"단기"라고 말할 때, "무엇보다 빨리 무언가를하고 나중에 생산에 닿기 전에 리팩토링을한다"는 것은 아닙니다. 아니요-프로덕션 소프트웨어에서 하드 코딩 된 기본값에 의존하는 것에 대해 이야기하고 있습니다. 물론 문제가 발생할 수 있지만 일년 내내 단 한 번의 문제 만 발생한다면 어떻게 될까요?

다시 한 번 말하지만 여기서 "평균"주류 소프트웨어 (원자력 발전 소용 소프트웨어가 아님)에 대해 이야기합니다. 평균 웹 사이트 또는 회계 소프트웨어 용 UI 응용 프로그램으로 사람들의 생명이 위태로워 지거나 수백만 달러가 아닙니다. .

다시 한 번, 내 경험에 비추어 볼 때 비즈니스 사용자는 "어떻게 작동"하는 소프트웨어를 사용하는 대신 완벽한 소프트웨어를 기다릴 것입니다. RAD 스타일로 소프트웨어를 개발하는 경우 기본값을 사용하면 많은 도움이됩니다. 그러나 다시 한 번-내가 보낸 가장 긴 디버그 세션은 기본값에 의해 도입 된 버그 때문에 길을 따라 "기본"이 중지되었거나 작은 하위 시스템이 최근에 업그레이드 되었기 때문에이 업그레이드의 결과로 그렇지 않았습니다. 기본값을 올바르게 처리하십시오 (예 : 빈 목록 대 널 또는 널 문자열 대 빈 문자열).

그래서 내 질문은-기본값은 선악입니다. 그리고 그들이 기술 부채라면-어떻게 당신이 상환을 감당할 수 있도록 얼마나 빌릴 수 있는지 측정합니까?

모든 의견을 보내 주셔서 감사합니다.

건배.

편집하다:

개발 중에 모서리를 자르는 방법으로 기본값을 사용하고 있고 모서리 자르기에 버그와 문제가 발생하는 경우 이러한 문제를 복구하는 방법은 무엇입니까?

답변:


23

합리적인 기본 값이 없으면 컨벤션에 대한 컨벤션 개념 은 불가능 합니다. 여기서 핵심 단어는 "합리적"입니다. 라이브러리 / 서비스 / 프레임 워크의 모든 사용 중 80 % 이상 (기본값은 아님)이 기본값이어야합니다.

일반적인 경험 법칙 :

  • 값이 80 % 이상 사용 가능한 경우 기본값이어야합니다.
  • 대부분의 경우에 사용되는 값이 없으면 기본값을 사용하지 마십시오.
  • 기본값은 설정 코드에서 바보 같은 실수를 방지합니다. 대부분의 경우 기본값이 합리적이면 작업 구성을 망칠 사람이 더 적습니다.
  • 기본값을 사용하면 비표준 구성이 더 잘 보입니다.
  • 잘못된 기본값은 기본값이 없는 것보다 나쁩니다 .

기본 구성이 어떻게 작동하는지 알게되면 비표준 구성을 수행하는 방법 /시기에 대한 교육적인 결정을 내릴 수 있습니다.


"컨벤션 오버 컨벤션"개념을 알려 주셔서 감사합니다. 나는 이름이 있다는 것을 모르고 그것을 사용했습니다. 이 규칙을 설명 할 수 있습니다. "기본값을 사용하면 비표준 구성이 더 잘 보입니다." 부디.

3
@Andrew에게 전화가 12 Foo()번이고 전화가 1 번 있으면 Foo("bar")그 중 하나의 전화가 눈에 띄는 경향이있어 더 잘 보입니다.
Matthew Scharley

1
맞습니다. 대부분의 FTP 서비스를 사용 new FtpService()하는 경우 대체 포트를 설정하는 것이 사용 됩니다 ( service.SetPort(12345)).
Berin Loritsch

43

FTP 프로토콜을 구현하는 라이브러리를 예로 들어 보겠습니다. 기본적으로 FTP는 포트 21에서 작동 할 것으로 예상됩니다. 이제 임의의 FTP 클래스의 객체를 생성 할 때마다 포트 21을 사용하도록 지정해야한다면 매우 짜증이납니다. 다른 포트가 필요하면 지정하겠습니다.

기본값은 정상일 때 완벽합니다.


21
+1. http://programmers.stackexchange.com:80/questions/?sort=newest&pagesize=50주소 표시 줄에 마지막으로 입력 한 시간은 언제 입니까?
Jörg W Mittag

1
따라서 기본 변수의 온 전성 수준을 어떻게 측정 / 추정 / 효과 화합니까?

5
합리적인 기본값을 생각하는 데 걸리는 시간
Alexander Gessler

1
@Andrew, 아래 답변을 참조하십시오. 값이 80 % 이상 사용하기에 적합하면 기본값으로 사용하는 것이 좋습니다.
Berin Loritsch

2
@Berin Loritsch : 기본값이 안전하게 실패하는 데 사용되는 경우 시간의 1 % 만 사용하더라도 좋다고 주장 할 수 있습니다.
oosterwal

18

기본 키 매핑, 기본 마우스 버튼 매핑, 기본 브라우저, 시스템 기본 언어로 입력, 부트 로더의 기본 OS에서 부팅, 기본 위치 메뉴, 기본 색 구성표, 기본 글꼴과 함께 기본 키보드 레이아웃을 사용하고있을 것입니다 너비 / 높이 / 얼굴 / 스타일, 기본 문자 세트, 기본 모니터 해상도, 기본 ... 아이디어를 얻습니다.

그러나 모든 진지하게, 나는 당신이 겪고있는 우려가 기본값이 아니라 다른 것에 있다고 생각합니다. 기본 동작은 본질적으로 버그를 가리지 않습니다. 대부분의 경우 코드는 기본값 설정 여부에 관계없이 일반적인 조건에서 실행됩니다. 처리되지 않은 엣지 케이스는 기본값이 변경되거나 흔하지 않은 시나리오가 발생할 때 (아마도 적절하고 적절한 테스트를 통해) 피하기 위해 원하는 것입니다.

또한 "catch-all"예외 처리는 "default"라고 부를 수있는 것이 아니라 설계상의 결함입니다.


"catch-all"은 실제로 좋은 예입니다. 그렇습니다. 언젠가 알 수없는 이유로 잘못 될 때 많은 슬픔을 일으키고 있으며, 이러한 예외적 인 부분은 대부분 예외적으로 모든 예외를 잃어 버렸기 때문에 알려지지 않았습니다. 그래서 나쁜 것입니다-맞습니까? 반면에 catch-all 블록이 없으면 소프트웨어가 모두 죽어 가거나 (예외가 처리되지 않은 경우) 복잡한 오류 처리 논리가 필요할 수 있습니다 (적어도 예외를 기록하고 일부 데이터를 기본값).

따라서 원래 질문에 추가하려면 개발 중에 모서리를 자르는 방법으로 기본값을 사용하는 경우와 모서리 자르기가 결과 버그와 문제가 발생하는 경우 이러한 문제를 복구하는 가장 좋은 방법은 무엇입니까?

1
예외가 발생하는 한 스레드 당 하나의 catch-all 예외가 있어야한다고 말하는 기사가 있습니다 . 오류보고에 사용되므로 OS가 프로세스를 보는 것과 동일한 방식으로 프로그램을 단일 "사물"로보고 있습니다. 루프에 최종 사용자 (및 개발자가 있기를 바랍니다)가 있으므로 실제로 예외를 "삼키지"않는 것이기 때문에 모든 것이 좋습니다. here 기사 : codeproject.com/KB/architecture/exceptionbestpractices.aspx
Rei Miyasaka

1
버그를 피하기 위해 기본값을 사용하는 것과 관련하여 제어 할 수있는 일관된 주석을 사용하는 것은 어떻습니까? 예를 들어 Visual Studio는 실제로 TODO: or TEMP:작업 목록에서 시작하는 모든 주석을 표시 합니다. 내가 개발을 위해 모퉁이를 자르고 있다면, 나는 TODO를 거기에 넣었는지 확인하기 위해 매우주의를 기울입니다. 그 중 어느 것도 중요한 빌드에 들어 가지 않습니다.
Rei Miyasaka

저는 개발을 돕기 위해 하드 코딩 된 값을 사용했습니다. 그건 그렇고, 나는 "하드 코딩 된 값"이 아마도 "기본값"이 아니라 찾고있는 단어라는 것을 깨달았습니다.
Rey Miyasaka

3

사용자 또는 개발자가 반복적 인 작업을 수행하지 못하게 할 때 기본값을 사용해야합니다. 오류나 예외를 마스킹하는 데 사용해서는 안됩니다. 오류를 방지하기 위해 오류를 사용하는 것은 좋지 않지만 예방이 잘못된 일을 가리지 않는 한에만 가능합니다. 기본값은 다른 모든 것과 마찬가지로 도구입니다. 제대로 사용하면 두통과 시간을 많이 절약 할 수 있습니다. 잘못 사용하면 집 전체가 무너질 수 있습니다.


정렬의 전체 다리 해제 ... 불고 C ++와 같은
Mateen Ulhaq을

1
@muntoo : 안녕하세요. Lisp는 '03 년에 절름발이가되었습니다.
Joel Etherton

3

인용 한 문제의 근본 원인은 기본값이 아니라 인터페이스 계약 변경, 해석 오해 및 / 또는 잘못된 가정으로 인한 통합 문제입니다. 기본적으로 이러한 모든 (구체적인 예) 는 클라이언트와 개발자 또는 다른 개발자 / 팀 간의 부적절한 통신 의 결과로 보입니다 . 공평하게도, 이러한 문제 유효하지 않은 기본값으로 표시 될 수 있지만 수많은 다른 형태로 나타날 수도 있습니다 .

증상이 아닌 근본 원인을 다루십시오.

또한 다른 사람들이 훌륭한 예를 통해 지적했듯이 기본값을 현명하게 사용하면 사용자의 삶을 훨씬 쉽게 만들 수 있습니다. 그리고 그것이 궁극적으로 우리의 목표입니까?


"부적절한 의사 소통"은 근본 원인 일 수 있지만 거의 모든 원인의 근본 원인이 아닙니까? "나의 궁극적 인 목표"는 비용이 제한된 환경에서 제 시간에 "좋은"소프트웨어를 제공하는 것이기 때문에 좋은 것에서 나쁜 / 나쁜 기본값을 말하는 방법을 알고 싶었습니다.

@ 앤드류, 커뮤니케이션 (혹은 부족)은 프로젝트의 성공 / 실패의 주요 요인이지만 유일한 것은 아닙니다. 그러나 범인 일 때는 적절하게 처리해야합니다. 그렇지 않으면 프로젝트가 거의 끝날 것입니다. 나는 나쁜 기본값을 좋은 것들과 분리하는 마술 도구를 모른다 .IMHO는 문제 영역, 유스 케이스 등을 잘 분석하고 많은 의사 소통을 요구한다.
Péter Török

1

통신 프로토콜 / 컨벤션의 일부가 아닌 기본값은 사악합니다. "부분이 아님"은 프로토콜이 엄격한 곳에서 문서화되지 않았거나 프로토콜이 느슨한 곳에서 단순히 예상되지 않는 것을 의미합니다.

기본값이 문서화 / 예상 되더라도 여전히 악의적 일 수 있지만 안전한 삶을 살 수도 있습니다. 도메인 영역에 따라 다릅니다. 매우 위험 할 수있는 경우 (예 : 기본 의약품 복용량, 기본 엘리베이터 층, 기본 자동차 이동 방향)가없는 경우가 종종 있으며 (예 : 기본 자동차 이동 방향, 기본 회의 시간) 위험하지 않을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.