남용되거나 남용 된 프로그래밍 기술 [폐쇄]


38

사람들이 시도하는 많은 문제에 대한 실질적인 해결책은 아니지만 프로그래밍에 남용 (IE가 필요 이상으로 과도하게 사용) 또는 남용 또는 모든 것에 조금 사용 된 것으로 보이는 프로그래밍 기술이 있습니까? 그것으로 해결하십시오.

정규 표현식, 디자인 패턴 또는 알고리즘 또는 완전히 다른 것일 수 있습니다. 사람들이 다중 상속 등을 남용한다고 생각할 수도 있습니다.


33
나는 IE가 너무 과도하게 사용된다는 데 동의하지만, 주로 프로그래머가 아닌 사람들이 사용합니다. . .
Eric Wilson

7
@FarmBoy-나는 그가 IE를 의미한다고 생각한다.
Raphael

지금 수정 :)
Anto

4
모든 기술은 (그리고 종종 남용 될 수있다.) 단지 다음은 총알로 제시되어야하며, 모든 문제를 못 (유를 섞기 위해)으로 취급하는 사람을 찾을 수있을 것이다.
ChrisF

8
@Rapheal-물론 농담이었습니다. 교육 주셔서 감사합니다.
Eric Wilson

답변:


73

코드의 주석

나는 대학 교수들이 학생들이 다음 코드가 1에서 x까지 반복되는 for 루프라는 10 줄의 주석을 쓰도록 가르 칠 필요가 없다는 것을 이해하기를 바랍니다. 코드에서 볼 수 있습니다!

먼저 자기 문서화 코드를 작성하고 적절하게 자기 문서화 할 수없는 것에 대해 적절하게 설명하도록 가르치십시오. 소프트웨어 세계가 더 나은 곳이 될 것입니다.


26
자체 문서화 코드는 없습니다. 또한 교수는 학생들에게 문제를 개념화하고 접근하는 방법을 가르치기 위해이를 수행합니다. 또한 아무도 너무 많은 문서에 대해 불평하는 것을 본 적이 없습니다. 설명서 인주의 사항이 정확합니다.
Woot4Moo

24
@ Woot4Moo :을 읽는다면 Clean CodeFowler는 오래된 문서가 문서가없는 것보다 나쁘고 모든 주석이 부실 해지고 문서화되는 코드에서 벗어나는 경향이 있음을 분명히 밝힙니다 . 이 책 전체는 자체 문서화 코드를 작성하는 방법에 관한 것입니다.
Scott Whitlock

12
주석을 코드 로 대체 하도록 가르치는 것은 좋은 시작이 될 것입니다 ...
Shog9

15
+1. 실제 코드에서 실제로 "loopVar ++; // incremental loopVar"를 보았습니다. AAAAAAAAAAAAARRRRRGH!
바비 테이블

7
@Bill : 일반적인 논리와 제어 구조가 비교적 복잡하더라도 문서화 할 필요가 없다는 점이 중요합니다. 기본적으로 코드를 분석하여 언어를 아는 훌륭한 개발자가 해결할 수있는 것은 주석 처리 할 필요가 없습니다. 예. 내부에 약간의 중단이있는 중첩 된 for 루프 집합. 그러나 주석을 달아야하는 것은 코드가 그러한 결정을 내리는 이유에 대한 응용 프로그램 별 추론입니다. "새로운 프로그래머가 내일 회사에서 시작해서 코드를 살펴보면, 주석 힌트 없이는 어떤 의미가 있는가?"
Bobby Tables

57

싱글 톤 디자인 패턴.

물론 유용한 패턴이지만 새로운 프로그래머가이 패턴에 대해 배울 때마다 자신이 만든 모든 단일 클래스에 적용하기 시작합니다.


나는 틀에 맞지 않게 설계된이 변명을 매일 프레임 워크에 사용합니다. codeigniter.com/user_guide/libraries/email.html 그들은 OOP에 접두사가 붙는 기능이라고 생각 $this->합니다. PHP는 썩은 언어이므로 프레임 워크가 뛰어날 것으로 기대할 수 없습니다.
Keyo

7
나는 싱글 톤을 구현하고 회개하지 않는 프로그래머라면 자신이 저지른 죄 때문에 불 같은 지옥에 타 버릴 것이라고 생각합니다.

2
나는 직업적인 직업 (멀티 태스킹 상황에서)에 싱글 톤을 한 번 구현했으며, 죄를 다시 써서 회개해야했습니다.
Spoike

3
싱글 톤은 몇 가지 사항에 유용 할 수 있지만 사용하지 않아야 할 때는 거의 항상 사용됩니다. 그렇다고해서 싱글 톤을 절대로 사용해서는 안된다는 의미는 아닙니다. 무언가가 남용되었다고해서 올바르게 사용할 수 없다는 의미는 아닙니다.
구성자

2
@Rapahel : 이것이 바로 디자인 패턴을 연구하는 것이 좋은 것이라고 믿지 않는 이유입니다.
구성자

53

바보 같은 프로그래밍을 보호하는 가장 악한 일. 시도 캐치에 모든 것을 넣고 캐치로 아무것도하지 않습니다.

        try
        {
            int total = 1;
            int avg = 0;
            var answer = total/avg;
        }
        catch (Exception)
        {

        }

나는 아무것도하지 않고 바보 같은 논리를 처리하도록 설계된 try catch를 볼 때 떨립니다. 일반적으로 try catch는 과도하게 사용되지만 경우에 따라 매우 유용합니다.


4
재미있는 것-방금 그 수백 번하는 파일을 편집하고 있었으며 그만한 이유가 있습니다. 예상대로 다양한 메소드에서 예외가 발생하는지 테스트하는 단위 테스트 파일입니다. try 블록에는 호출 및 "예상 던지기가 발생하지 않았습니다"보고서가 포함됩니다. 예외가 예상되고 정확하므로 수정 조치가 없습니다. 분명히 단위 테스트는 특별한 경우이지만 실제 코드에서도 비슷한 경우가 있습니다. 적기, 그렇습니다, 그러나 절대적인 규칙은 아닙니다.
Steve314

5
@ 설명한 사례는 드문 에지 조건입니다. 내가 생각할 수있는 또 다른 것은 로깅 코드입니다. 로깅 자체가 실패하면 예외를 기록하려고 시도하거나 앱을 중단하려고 할 필요가 없습니다.
dbkk

1
@dbkk-가장자리 조건에 동의했으며 실제로 예외를 잡아야하지만 수정 조치가 필요하지 않은 경우 catch 블록에 주석을 추가하여 관리자. 단위 테스트에서는 그렇게 드물지 않으므로이 경우 주석을 삭제합니다.
Steve314

5
오류 재개시 다음
jk.

2
@ jk01-예외는 (필수적으로) 오류가 아닙니다. 조건이 오류인지 여부는 컨텍스트에 따라 다릅니다. 예를 들어, 파일이 필요하지 않은 경우 "파일을 찾을 수 없음"은 오류가 아닙니다. 아마도 존재하지 않을 수도있는 선택적 설정 파일 일 수도 있으며 파일이없는 경우 기본값을 그대로 둘 수 있습니다 (따라서 캐치 후에 수정 조치가 필요하지 않음).
Steve314

47

어려운 문제를 파악하는 대신 문제를 해결하기 위해 StackOverflow에 의존합니다.

SO에 대한 풍부한 지식을 찾는 새로운 프로그래머는 생각하고 시도하기 전에 게시물을 게시합니다.

하루는 책이나 인터넷, 코드를 코딩해야했습니다. 이제 내 잔디밭에서 내려


28
나는 인정해야한다. 나는 SO에 대한 몇 가지 질문의 대담함에 빠져있다. 그들은 매일 여러 번 질문을 받고 전혀 검색하지 않았기 때문에; 더 나쁜 것은 커뮤니티를 무료 아웃소싱 서비스로 취급하는 것입니다.
Orbling

2
@dbkk : stackoverflow.com/questions/4665778/…- > 첫 번째 코멘트 "당신은 이것을 시도한 적이 있습니까?"
Matthieu M.

5
나는 책에서 배우기 시작했지만 일단 기초가 있으면 온라인 포럼 토론에서 거의 모든 것을 배웠습니다. 묻는 것이 아니라 주로 독서 (독점적으로)에 의한 것입니다. 이 방법은 나에게 많은 구석과 잔인한 깊이를 가진 몇 가지 프로그래밍 언어를 가르쳐 주었으며 전혀 나쁜 방법이 아니라고 생각합니다.
Konrad Rudolph

1
@ Konrad Rudolph : 그 방법은 좋고 현명하며 질문을 읽고 잘 검색합니다. 질문하는 사람은 대답을 이해하기위한 프레임 워크가있을 때 가장 잘 수행됩니다. 너무 자주 사람들은 자신이 이해할 능력이없는 질문을합니다.
Orbling

3
문제는 간단한 Google 검색으로 대답 할 수있는 매우 쉬운 질문을하고 대답하는 데 많은 답변을 제공함으로써 이것을 장려한다는 것입니다. 매우 어려운 질문 사람들은 정말로 원하기 때문에 대답합니다.
IAdapter

36

분명히. 매우 가치가 있지만 잘못 사용 하면 명확한 코드를 쉽게 숨기고 (R의 S4 프로그래밍의 일부 예가 떠오를 수 있음) 불필요한 오버 헤드를 줄 수 있으며 불필요한 오버 헤드를 제공하여 성능에 큰 시간을 소비 할 수 있습니다.

또 다른 것은 (예를 들어 Perl) OOP가 종종 같은 방식으로 다른 방식으로 작성하는 경우가 종종 있습니다. result = $object ->function(pars)대신에 result = function(object, pars)이것은 의미가 있지만 절차 적 프로그래밍과 혼합하면 코드를 읽는 것이 매우 혼란 스러울 수 있습니다. 그 외에도 디자인을 개선하지 않는 경우 더 많은 오버 헤드가 발생합니다. 싱글 톤 패턴에 대해서도 언급되어 있습니다. 모든 것이 아니라 사용해야합니다.

나는 OOP를 스스로 사용하지만, 내 분야 (과학 컴퓨팅) 성능은 큰 문제이며, 오늘날 모든 학생들이 Java를 얻음에 따라 OOP가 종종 남용됩니다. 더 큰 문제를 다루고 개념화하는 데 좋습니다. 그러나 BioPerl에서 DNA 서열로 작업하는 경우 매번 객체를 사용하고 게터 및 세터와 일관되게 작업하면 계산 시간이 10 배 증가 할 수 있습니다. 코드가 몇 시간이 아닌 며칠 동안 실행되면 그 차이가 실제로 중요합니다.


6
@Craige : 나는 OOP를 직접 사용하지만 내 분야 (과학 컴퓨팅) 성능은 큰 문제이며 오늘날 모든 학생들이 Java를 얻음에 따라 OOP가 종종 남용됩니다. 더 큰 문제를 다루고 개념화하는 데 좋습니다. 그러나 BioPerl에서 DNA 서열로 작업하는 경우 매번 객체를 사용하고 게터 및 세터와 일관되게 작업하면 계산 시간이 10 배 증가 할 수 있습니다. 코드가 몇 시간이 아닌 며칠 동안 실행되면 그 차이가 실제로 중요합니다.
Joris Meys

1
@Craige : (와 같은 Foo.DoX().DoY().DoZ()) 메소드 체인 은 훌륭하지만, 무언가를 다루는 유일한 방법은 아닙니다. 기능 구성 (예 doZ . doY . doX $ foo: 완벽하게 유효한 대안
Anon.

1
@Joris : 내가 오랫동안 궁금해 한 것 (나 자신은 생물 정보 학자) : 성능이 그렇게 중요하다면 왜 Perl을 C ++ 대신 사용합니까? 런타임에서 요소 10을 제거하는 것이 걱정되는 경우 (유효한 문제!) C ++로 전환하면 즉시 만족할 수 있습니다. 물론 언어는 빨라요.하지만 Perl도 그렇습니다. 그리고 C ++을위한 좋은 생물 정보학 라이브러리가 있습니다.
Konrad Rudolph

1
@ Konrad : 그것은 달려 있습니다. BioPerl은 모든 언어의 생물 정보 학자들을 위해 가장 많은 패키지를 가지고 있습니다 (Python이 따라 잡고 있다고 생각합니다). 또한 Perl에서 많은 작업을 수행했으며 C ++로 모든 것을 다시 작성하는 것보다 스크립트를 수정하는 것이 더 쉽습니다. 마지막으로, 스크립트가 수행 될 때 완전한 응용 프로그램을 작성하는 것은 제공되지 않습니다. 그것이 Perl이 여전히 그렇게 많은 이유라고 생각합니다. 솔직히, 나는 언어를 좋아한다. 여전히 문자열 및 파일 작업에 대해 가장 잘 알고 있습니다. 계산은 분명히 다른 언어로 수행되고 다시 연결됩니다 (매우 쉽습니다).
Joris Meys

1
@ Konrad : 그것은 어떻게하는지에 달려 있습니다. Perl에서 모든 작업을 수행 할 수 있지만 Perl은 다른 도구, 특히 Linux에서 쉽게 연결할 수 있습니다. 필자는 Perl을 강력한 문자열 조작과 다른 응용 프로그램에 쉽게 넣을 수있는 데이터 집합을 쉽게 구성 할 수있는 고급 bash 스크립트로 자주 사용합니다.
Joris Meys

27

ASP.NET Webforms에서 몇 년을 보냈지 만 분명한 말을해야합니다.

스마트 UI

Webforms에서 계층화되고 테스트 가능한 응용 프로그램을 만드는 것이 전적으로 가능하지만 Visual Studio를 사용하면 개발자가 모든 UI 코드 주위에 응용 프로그램 논리가 흩어져있는 방식으로 한 번의 클릭으로 데이터 소스에 단단히 바인딩 된 양식을 만들 수 있습니다.

Steve Sanderson은이 안티 패턴을 Pro ASP.NET MVC 서적에서 할 수있는 것보다 훨씬 더 잘 설명합니다.

스마트 UI 응용 프로그램을 빌드하기 위해 개발자는 먼저 일련의 UI 위젯을 캔버스로 끌어 UI를 구성한 다음 가능한 각 버튼 클릭 또는 다른 UI 이벤트에 대한 이벤트 처리기 코드를 채 웁니다. 모든 애플리케이션 로직은 다음과 같은 이벤트 핸들러에 상주합니다. 사용자 입력을 승인 및 검증하고, 데이터 액세스 및 스토리지를 수행하고, UI를 업데이트하여 피드백을 제공하는 로직입니다. 전체 응용 프로그램은 이러한 이벤트 처리기로 구성됩니다. 기본적으로 이것은 Visual Studio 앞에 초보자를 둘 때 기본적으로 나타나는 경향이 있습니다. 이 디자인에서는 관심사가 분리되지 않습니다. 발생할 수있는 다른 UI 이벤트 측면에서만 모든 것이 통합되어 있습니다. 로직 또는 비즈니스 규칙을 둘 이상의 핸들러에 적용해야하는 경우 코드는 일반적으로 복사하여 붙여 넣습니다. 또는 무작위로 선택된 특정 세그먼트는 정적 유틸리티 클래스에 포함됩니다. 여러 가지 명백한 이유 때문에 이러한 종류의 디자인 패턴을 안티 패턴이라고합니다.


1
GUI는 적어도 일종의 사양 코드가 준수해야합니다. 빈 텍스트 파일을 제시하면 프로그래머가 더 잘 할 것이라고 생각하지 않습니다.

4
@qpr, 나는 그것에 대해 모른다. 빈 텍스트 파일이 있으면 아무것도 할 수 없을 수도 있습니다 (보너스 일 수도 있음).
Ken Henderson

WPF를 사용하면 얻을 수있는 많은 이점 중 하나는 MVVM을 구현하면이 안티 패턴이 스패 터린으로 분쇄된다는 것입니다.
Robert Rossney

2
이 천 번. 숙련 된 .NET 개발자들도이 "패턴"에 의존하는 것을 보았습니다. 왜냐하면 관심의 분리에 대해 이해하거나 돌보는 것보다 쉽습니다. 끌어서 놓기 마법사를 사용하지 않더라도 .NET WebForms 개발에서 가장 일반적인 "패턴"은 코드 숨김 이벤트의 모든 작업을 수행하고 필요에 따라 코드를 복사 / 붙여 넣기하는 것입니다.
Wayne Molina

23

나는 때때로 이것을보고 부울 식을 완전히 이해하지 못했기 때문에 발생합니다.

if (someCondition == true)

16
코드를보다 명확하게 만들 수 있다는 이점이 있습니다
Pemdas

7
:이 질문에 대해 살펴 순서대로 생각 programmers.stackexchange.com/questions/12807/...
gablin

5
나는 그것을하지 않지만 심각하게 극복하십시오. 거기에 훨씬 더 나쁜 지옥이 있습니다. :)
MetalMikester

4
예를 들어 또는로 bool시작하는 것과 같이 변수의 이름을 올바르게 지정한 경우 코드를보다 명확하게 지정할 필요가 없습니다 . ishas= true
아무도

3
@DisgruntledGoat 전혀 사용해서는 안되기 때문에
Corey

19

코어의 존재에 대한 무지 또는 커스터마이제이션에 대한 인식의 필요성 때문에 코어 (또는 다른 방식으로 제공) 기능을 다시 구현 합니다.


2
학습은 예외입니다. 무엇이든 공부할 때 종종 "바퀴를 재창조"하는 것이 좋습니다.
Maxpm

확실히-프로덕션 소프트웨어를 만들 때만 관련이 있음을 지정해야합니다.
l0b0

1
이것은 보안과 관련된 것을 구현할 때 특히 나쁩니다. 우수한 보안 소프트웨어는 대부분의 사람들이 생각조차하지 않는 공격을 방지합니다.
David Thornley

나는이 방법이 너무 일반적임을 봅니다. 우리는 X가 필요합니다, 우리 자신을 작성합시다! 그러나 오픈 소스 패키지 Y는 어떻습니까? 아니요, 우리는 업계의 다른 모든 사람들과 동일한 비밀 비밀을위한 맞춤형 소프트웨어가 필요합니다. 일반적인 쓰레기 처리 소프트웨어를 사용할 수 없습니다!
Wayne Molina

18

계승.

이해가되지 않는 곳에 is-a를 강요하지 마십시오.


6
문제는 직관적으로 "is-a"가 매우 의미가있는 것으로 보인다는 것입니다 (특히 모든 구현 / 계약 관계를 구어 적으로 "is-a"로 표현할 수 있기 때문에). 이것이 실제로 실수이고 상속 및 인터페이스 구현이 근본적으로 다르다는 것을 인식하려면 OOP에 대한 확실한 이해가 필요합니다.
Konrad Rudolph

@ Konrad-절대적으로 동의하십시오. 나는 사람들 이 composition 으로 시작하고 인터페이스로 넘어 가고 상속을 마지막으로 고려 하도록 장려하려고 노력합니다 . (물론 원칙적으로). 그러나 아마도 저의 VB 배경은 ... ;-)
Mike Woodhouse

1
그러나 이것은 주로 언어 디자인 질문입니다. Java 또는 C #과 같은 언어에서 "구현보다 상속 구현을 선호"해야하는 이유는 구현 상속이 해당 언어를 빨아 들이기 때문입니다. 일부 사람들 은 상속을 과도하게 사용하는 것으로 Bertrand Meyer의 객체 지향 소프트웨어 구성 을 비판 하지만 실제로 에펠 (도서에 사용 된 언어)을 보면 구현 상속위해 설계된 것이므로 상속을 사용하는 것이 좋습니다. 구성. 에서 경우, 적어도.
Jörg W Mittag

14

상용 소프트웨어 사용자 정의

이것이 유용 할 수 있음을 인정할 수는 있지만, 의심스러운 이익을 위해 적은 일을하는 데 얼마나 많은 돈이 소비되는지 궁금합니다. 여기에서 회사는 일부 소프트웨어의 라이센스에 수백만 달러가 아닌 수십만 달러를 소비 할 수 있으며,이 소프트웨어는 구성 가능하고 편집 가능하며 유연하여 기본적으로 실제로 많은 일을하지 않기 때문에 사용자 정의됩니다. 결국 모든 새로운 코드가 처음에 구입 한 것을 추가했기 때문에 맞춤형 응용 프로그램입니다.


이것이 사용자 지정 응용 프로그램의 경우가 아닐까요?
JeffO

13

컴파일러를 디버거로 사용합니다.

Complier 경고를 무시하거나 완전히 끄십시오.

글로벌 변수.


18
"컴파일러를 디버거로 사용하는"문제가 무엇입니까? 런타임시 문제가되기 전에 코드에서 오류를 지적 할 수있는 컴파일러를 갖는 것은 엄청난 이점입니다.
메이슨 휠러

3
구문 오류와 잘못된 유형 일치 오류를 잡는 컴파일러에 의존합니다. 행동 오류의 경우 테스트 사례에 의존합니다.
gablin

5
문제는 프로그램 정확성을 보장하기 위해 컴파일러에 의존하기 시작할 때입니다. 이 컴파일 했습니까? 아니요,이 작은 부분을 뭉개 서 고정되었는지 확인하겠습니다. 컴파일 했습니까? 아니요, 여기 저기 *를 추가하고 컴파일되는지 확인하겠습니다. ... 요법. 오타 수정에 유용합니다
Pemdas

2
마치 마치 코더가 어둠 속에서 맹목적으로 주위를 파고있는 것처럼 코드를 어떻게 든 컴파일하기 위해 무언가를하려고합니다. IME 작동 방식이 아닙니다. 컴파일러는 유용한 오류 메시지를 제공하고 오류의 위치를 ​​알려줍니다. 컴파일되지 않는 경우 일반적으로 자신이 작성한 새 코드이므로 잘못된 점과 일단 지적되면 수정하는 방법에 대한 좋은 아이디어가 있습니다. 아웃. (임의의 *를 던지더라도 C ++에서 작업 중일 수 있습니다. 컴파일러 오류는 매우 도움이되지 않는 것으로 알려져 있으므로 내가 말한 것은 적용되지 않을 수 있습니다.)
Mason Wheeler

3
충분히 강력한 형식 시스템과 형식이 지정된 코드 기반을 고려할 때 컴파일러에 의존하는 것이 매우 효과적입니다. 종종 유형 시스템 테스트를 작성해야하는 중요한 제약 조건을 모델링 할 수 있습니다 (예 : 약한 유형의 시스템). 신중하게 사용하면 컴파일러 (특히 유형 검사기)는 테스트 및 디버깅에 자산 이며 의존하는 데 아무런 문제가 없습니다 . 특히, 컴파일러가 구문 오류 만 표시 할 수 있다고 말하는 것은 잘못입니다.
Konrad Rudolph

11

모든 디자인 패턴.

그들은 소금이나 설탕과 같습니다. 당신의 음식에있는 그들 중 일부는 그것을 훌륭하게 만들고, 많은 사람들이 음식을 짜증나게합니다.

내가 틀리지 마 디자인 패턴은 훌륭한 기술입니다. 나는 그들을 많이 사용했습니다. 그러나 때때로, 나는 "당신은 디자인 패턴을 사용해야합니다"라는 문제를 가진 프로그래머를 찾았습니다.

예를 들어 "선형 / 순차 컬렉션"에보다 적합한 "방문자 패턴"이 있습니다. 한 번 트리 데이터 구조로 작업해야했습니다. 각 항목을 "방문"하기 위해 비 디자인 패턴 방법을 코딩하고 전 상사는 "방문자 패턴"을 사용하거나 적용 할 것을 주장합니다. 그런 다음 두 번째 의견을 얻기 위해 인터넷을 탐색합니다. 글쎄, 다른 프로그래머들도 같은 상황과 같은 해결책을 가지고있었습니다. 새로운 디자인 패턴으로 "트리 / 계층 방문자 패턴"이라고합니다.

"디자인 패턴"책의 새 버전에서 기존 패턴에 새로운 패턴으로 추가되기를 바랍니다.


3
때로는 디자인 패턴을 사용하지 않지만 때로는 코드에서 자연스럽게 나타납니다.
구성자

그 말은 어떻게됩니까? 패턴을 사용하고 있다는 사실을 모르고 패턴을 사용하기 시작한 다음, 패턴에 대해 배우고 어디에서나 사용하는 것이 제 2의 성격이되어 패턴을 사용하고 있다는 것을 모르고 사용하기 시작합니까?
Wayne Molina

2
@configurator 디자인 패턴을 읽을 때; 또한 저와 다른 개발자들이 이미 그중 일부를 사용하고있는 것을 발견했습니다. ;-)
umlcat

9

흐름 제어로 예외 사용 유사의 정렬 이 대답 하지만, 다른.

예외를 삼키는 것은 코드에서 신비하고 찾기 어려운 버그를 유발하기 때문에 나쁜 형태입니다. 반면에 흐름 제어로 예외를 사용하는 것은 코드를 훨씬 비효율적으로 만들고 개념적으로 부주의하기 때문에 좋지 않습니다.

예외 처리는 예상치 못한 예상치 못한 시나리오를 처리하는 데만 사용해야하며 숫자가 예상되는 알파벳 문자를 입력하는 사용자와 같은 것은 아닙니다. 이런 종류의 예외 남용은 Java 세계의 나쁜 프로그래머들 사이에서 매우 흔합니다.


비효율적 인 코드를 만드는 예외는 언어에 따라 다릅니다-스택 프레임 만들기 등 즉, 예외는 언어가 아닌 라이브러리의 일부입니다. 그러나 예외 제어 제어 흐름을 사용 하는 것은 혼란 스럽습니다 . lshift.net/blog/2011/01/04/try-again-with-exceptions shows 내가 최근에 찾은 루프 사용 예외.
Frank Shearar

마지막 단락과 관련하여, 다시 한 번 말하면 언어에 따라 다릅니다. Common Lisp의 예외 ( "조건")는 대부분의 언어 아이디어 예외에 대한 엄격한 상위 집합입니다. 여기 예를 참조하십시오 : gigamonkeys.com/book/… 모든 것과 마찬가지로 너무 멀리 갈 수 있습니다!
Frank Shearar

가독성과 유지 관리 성이 성능을 능가합니다. 성공을 위해 예외를 사용하는 경우 ( "흐름 제어"의 의미라고 생각되는 경우)는 매우 드물지만 복잡한 재귀 검색과 같이 더 깨끗한 코드를 제공 할 수 있습니다. 전반적으로 동의합니다. 예를 들어, 나는 반복자가 "널 (null)"(내부 불일치의 어떤 종류의 가능성이 기호) 인 경우 반환 (반복의 끝에서 공통) 범위의 외출에 대한 거짓,하지만 예외를 던질 것을 반복자 방법과 용기를 가지고
Steve314

7

과도한 데이터 숨기기를 통해 유연성을 가지려고합니다.

우리는 추상화와 구현을 숨기는 것이 좋지만 항상 더 나은 것은 아니라는 것을 알고 있습니다. 지나친 요구 사항의 변화에 ​​대처할 수없는 융통성없는 결과를 얻을 수 있습니다. 변경 사항을 처리하려면 해당 변경 사항을 처리해야하는 클래스를 수정해야 할뿐만 아니라 데이터 숨기기 계층에도 불구하고 액세스 할 수 없었던 정보에 대한 방법을 만들어야합니다.

문제는 모든 상황에 맞는 올바른 균형을 찾는 것과 마찬가지로 경험이 필요하다는 것입니다.



6

가변 상태 및 루프. 거의 필요하지 않으며 거의 ​​항상 더 나은 코드를 얻습니다.

예를 들어, 이것은 StackOverflow 스레드에서 직접 가져옵니다.

// ECMAScript
var thing, things_by_type = {};
for (var i = 0; i < things.length; i++) {
    thing = things[i];
    if(things_by_type[thing.type]) {
        things_by_type[thing.type].push(thing);
    } else {
        things_by_type[thing.type] = [thing];
    }
}

# Ruby
things_by_type = {}
things.each do |thing|
  (things_by_type[thing.type] ||= []) << thing
end

그들은 모두 같은 일을하고 있습니다. 그러나 나는 그들이 무엇 을하고 있는지 전혀 모른다 . 다행히도, 질문은 실제로 그들이하는 일을 설명하므로 다음과 같이 다시 작성할 수 있습니다.

// ECMAScript
things.reduce(function (acc, thing) {
    (acc[thing.type] || (acc[thing.type] = [])).push(thing);
    return acc;
}, {});

# Ruby
things.group_by(&:type)

// Scala
things groupBy(_.type)

// C#
from thing in things group thing by thing.Type // or
things.GroupBy(thing => thing.Type);

루프가없고 변경 가능한 상태가 없습니다. 음, 명백한 루프와 루프 카운터는 없습니다.

코드는 훨씬 짧아지고 훨씬 단순 해졌으며, 코드가 수행해야 할 작업에 대한 설명과 비슷해졌으며 (특히 루비의 경우에는 "유형별로 그룹화"라고 거의 직접 표시합니다) 오류가 훨씬 적습니다. 루프 인덱스 및 종료 조건이 없기 때문에 루프 끝 및 종료 조건에서 어레이 끝, 펜스 포스트 오류 또는 한 번에 하나씩 오류를 실행할 위험 이 없습니다 .


나는 "고정 된"ECMAScript의 두 번째 줄 (acc[thing.type] || (acc[thing.type] = []))에서`= [thing] 일`과는 반대로 , unless you want to add 목록을 두 번 읽어야한다고 생각합니다.
Austin Hyde

@Austin Hyde : 네 말이 맞아.
Jörg W Mittag

1
이 ecmascript 예제는 많은 프로그래머가 이해할 수 없습니다. 너무 많은 구문 트릭에 의존합니다. 루프는 주니어 개발자에게 명확성의 이점이 있습니다.
Joeri Sebrechts

6

조롱. 코드에 과도한 디커플링을위한 인공적인 요구 사항이 너무 많아 과도하게 엔지니어링 된 라비올리 코드로 이어지고보다 절차 적이거나 기능적인 디자인이 문제에 대한 간단한 해결책 일 때 목을 줄이십시오.


이론적으로 동의했다. 모의 객체는 유용하지만 당신은하지 않습니다 그들을 가지고.
Wayne Molina

조롱의 침입 성은 사용하는 언어에 따라 다릅니다. C #에서는 매우 침습적이며 불필요한 인터페이스를 추가합니다.
Frank Hileman

3

전 세계 델파이 프로그래머들은 지난 2 년간 전체적인 유니 코드 변환으로 인해 문자 배열을 사용하여 바이트를 저장하는 것이 얼마나 나쁜지 알아 냈습니다.

그리고 "곧" 64 비트로 변경 하고 싶을 때 정수를리스트에 저장하는 것이 얼마나 나쁜지 알게 될 것 입니다.


2
Borland가 기본적으로 AnsiString과 동일하지만 Blob과 함께 사용하기 위해 DataString 유형을 선언 한 다음 사람들이 그것에 대해 알도록한다면 유니 코드 문제의 상당 부분이 발생하지 않았을 것이라고 생각합니다.
메이슨 휠러

2

속성. 나는 이것이 논란의 여지가 있다는 것을 알고 있지만 .net에서 속성이 많이 남용된다고 생각합니다.

이 두 라인의 차이점은 무엇입니까?

public string Property { get; set; }

public string Field;

개발자에게는 차이점이 전혀 없습니다. 컴파일 된 양식을 사용하면 라이브러리를 작성하고, 만약 그렇다면, 작은 비트 다른 해당 라이브러리가 프로그램에서 업그레이드 할 것입니다, 그리고 당신이 플러그인을위한 인터페이스를 작성하는 경우 (예를 들어, 프로그램 자체를 다시 컴파일 할 수없는 소프트웨어의 여러 버전에서 작동해야합니다) 그런 다음 공용 필드를 속성으로 바꿀 수 없으므로 공용 필드를 사용하지 않아야합니다. 다른 경우 에는 필드를 사용하는 것과 수정자가없는 자동 속성을 사용하는 것에는 전혀 차이없습니다 .


1
합의 경우 100 %를 아는 당신은 그 속성을 가질 아무런 이유가없는 "속성"을 설정 / 얻고으로 아무것도 할 필요가 없습니다 것입니다. 그러나, 예를 들어 값이 변경되었음을 기록하는 무언가를해야 할 경우에는 속성을 사용해야합니다. 개인적으로 내가하는 충분히 큰 차이를 보이지 않는 되지 방금 경우, 속성을 사용 (내가 알고, 알고 나중에 수정이 필요 YAGNI하지만이 경우에는 일탈 느끼지 비용 아무것도하지)
웨인 몰리나

2
@Wayne 어떻게 변화 ;{ get { ... } set { ... } }변화보다 더 많은 일 { get; set; }{ get { ... } set { ... } }?
구성자

내가 생각하기에, 그것은 공정한 포인트입니다.
Wayne Molina
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.