한때 마음에 들었던 프로그래밍 관행에 대해 마음이 바뀌 었습니까? [닫은]


99

프로그래밍 할 때 우리 모두는 우리가 사용하고 의존하는 관행과 패턴을 개발합니다. 그러나 시간이 지남에 따라 우리의 이해, 성숙도, 심지어 기술 사용이 변경됨에 따라 우리가 한때 훌륭하다고 생각했던 일부 관행이 그렇지 않거나 더 이상 적용되지 않는다는 것을 깨닫게됩니다.

한때 자주 사용했지만 최근 몇 년 동안 변경된 사례는 Singleton 객체 패턴을 사용하는 것입니다 .

내 자신의 경험과 동료들과의 긴 토론을 통해 싱글 톤이 항상 바람직한 것은 아니라는 것을 깨달았습니다. 싱글 톤은 테스트를 더 어렵게 만들 수 있고 (모킹과 같은 기술을 억제함으로써) 시스템 부분 사이에 바람직하지 않은 결합을 만들 수 있습니다. 대신, 이제는 신경 쓰지 않거나 알 필요가없는 시스템 부분에서 싱글 톤의 특성과 존재를 숨기는 객체 팩토리 (일반적으로 IoC 컨테이너 사용)를 사용합니다. 대신, 이러한 개체에 대한 액세스 권한을 얻기 위해 공장 (또는 서비스 로케이터)에 의존합니다.

자기 계발 정신으로 커뮤니티에 대한 나의 질문은 다음과 같습니다.

  • 최근에 어떤 프로그래밍 패턴이나 관행을 재고하고 이제 피하려고하십니까?
  • 무엇으로 교체하기로 결정 했습니까?

답변:


159


//Coming out of university, we were taught to ensure we always had an abundance 
//of commenting around our code. But applying that to the real world, made it 
//clear that over-commenting not only has the potential to confuse/complicate 
//things but can make the code hard to follow. Now I spend more time on 
//improving the simplicity and readability of the code and inserting fewer yet 
//relevant comments, instead of spending that time writing overly-descriptive 
//commentaries all throughout the code.



+1. 나는이 같은 대답을 게시하려고했습니다. 몇 주 전에 아카이브 디스크에서 이전 프로그래밍 과제 중 일부를 발견했습니다. 모두 똑같아 보였습니다. 주석 줄과 코드 줄의 비율은 거의 1 : 1입니다.
Michael Moussa

32
당신 같은 사운드에 댓글 잘못 너무 많이. 코드는 그 자체로 말하지 않습니다. 아뇨. 그렇지 않습니다. 이에 대한 좋은 호언을 위해 최신 NT Insider를 읽어보십시오. 댓글이 중복 될 것이라고 생각하면 잘못했거나 잘못하고있는 것입니다. 대학은 올바른 댓글을 가르치지 않습니다 (또는 버그 추적 또는 버전 관리 ... * 한숨 *). 댓글이 너무 적습니다. (그리고 더 적은 좋은 것)
토마스

5
Code Complete에는 주석 달기에 대한 유용한 팁과이를 백업 할 데이터가 있습니다.
토마스

20
댓글을 설명하는 데 사용되어야 하는 이유 (가 분명하지의 경우) 코드가 무엇을 수행하지 무슨 코드가 않습니다. 가능한 예외는 Carmack의 매직 넘버 0x5f3759df와 같은 미친 비트 트위들 링 / 언어 해킹입니다.
크리스 시몬스

6
@Thomas : 개인적으로 문제는 좋은 논평을 가르치는 것이 대학이 학생들에게 보여줄 수있는 것이 아니라는 것입니다. 학교의 거의 모든 프로그램은 일회성입니다. 학생들은 1 년 전에 작성한 코드를 되돌아 보면서 전혀 이해하지 못합니다. 또한 하위 수준의 클래스는 정말 간단한 코딩 개념을 가르칩니다.이 수준에서 주석을다는 것은 무슨 일이 일어나고 있기 때문에 거의 지루합니다. 다른 말로하면 물놀이 장에서 수영을 가르치는 것과 같습니다. 그들이 움직임을 이해하는 것은 올바른 맥락이 아닙니다.
Dan Lew

117

단일 리턴 포인트.

나는 루틴에 필요한 정리가 간과되지 않도록 보장 할 수 있었기 때문에 각 메소드에 대해 단일 리턴 포인트를 선호했습니다.

그 이후로 저는 훨씬 더 작은 루틴으로 이동했습니다. 따라서 정리를 간과 할 가능성이 줄어들고 실제로 정리 의 필요성 이 줄어 듭니다. 그리고 조기 반환이 코드의 명백한 복잡성 (중첩 수준)을 감소 시킨다는 것을 알게되었습니다. 단일 반환점의 아티팩트 ( "결과"변수 유지, 플래그 변수 유지, 아직 완료되지 않은 상황에 대한 조건절 유지)는 코드가 실제보다 훨씬 더 복잡해 보이게하고 읽기 및 유지 관리를 어렵게 만듭니다. 초기 출구와 더 작은 방법이 갈 길이다.


3
데이터 유형과 결합했을 때 자동으로 등 autoptr scoped_ptr를, CComPtr로, 자신을 청소하는 것이, 동의
i_am_jorf

3
코드 정리는} {시도가 마지막으로 {}입니다 무엇
banjollity

@banjollity : finally {}를 지원하지 않는 언어는 제외됩니다. 또한이를 지원하는 언어에서도 마지막으로 {}가 항상 실행이 보장되는 것은 아닙니다.
Chris K

1
@banjollity, Chris : C ++에서 정리는 소멸자의 목적이며 극단적 인 상황 (exit (), 스택 해제 중에 예외를 던지는 소멸자, 다람쥐가 전력을 차단하는 경우)을 제외하고는 실행이 보장됩니다.
David Thornley

4
동의합니다. Nested Conditional을 Guard Clauses ftw로 바꾸십시오!
Jonik

111
  • 첫 번째 시도에서 완벽하게 코딩하려고합니다.
  • 코딩하기 전에 완벽한 OO 모델을 만들려고합니다.
  • 유연성과 향후 개선을 위해 모든 것을 설계합니다.

한마디로 오버 엔지니어링 .


6
잠깐, 나는 항상 첫 번째 시도에서 그것을 올바르게 얻습니다. :)
i_am_jorf 2009-07-07

18
진짜 돈은 처음에 미묘하게 잘못 이해하고 야생으로 내보내는 데 있습니다. 그런 다음 사람들이 김프 버전에 익숙해지면 오만한 쇼맨쉽으로 급습하고 버그 / 비효율을 수정하여 추가 영광을 거두십시오! ;)
Eric

7
@jeffamaphone-아니요, Jon Skeet만이 처음으로 올바르게 이해합니다.
Jordan Parmer

말씀처럼 나는 "overengineering"
Neilvert NOVAL을

@jeffamaphone-나는 항상 첫 번째 시도에서도 제대로 이해합니다. 그러나 추가 시도는 내가 필요한 것을 제공합니다 :)
umbr

78

헝가리 표기법 (양식 및 시스템 모두). 나는 모든 것을 접두사로 사용했습니다. strSomeString 또는 txtFoo. 이제 someString 및 textBoxFoo를 사용합니다. 새로운 누군가가 와서 픽업하기가 훨씬 더 읽기 쉽고 쉽습니다. 추가 보너스로 일관성을 유지하는 것은 사소한 일입니다. 컨트롤을 camelCase하고 유용하고 설명적인 이름을 추가합니다. Forms Hungarian은 항상 일관성이 없다는 단점이 있으며 Systems Hungarian은 실제로 많은 것을 얻지 못합니다. 모든 변수를 함께 묶는 것은 특히 최신 IDE의 경우 그다지 유용하지 않습니다.


Python 또는 JavaScript와 같은 동적 형식의 언어는 어떻습니까? 이러한 언어에서 헝가리어 표기법을 사용하는 것이 여전히 도움이되므로 변수를 볼 때 어떤 유형의 변수를 예상해야하는지 알 수 있습니다 (예상 할 유형이있는 경우-물론 동적 유형 언어를 처리하는 것은 어리석은 일입니다) 정적으로 입력 된 언어와 똑같습니다.)
Dan Lew

4
fooTextBox와 문자열은 다음과 같은 점을 제외하고 비슷합니다. numberOfEntries => int, isGreat => bool 등
rball

헝가리어 표기법 제거에 +1. 나는 rball에 동의합니다. 실제로 필요한 경우 fooTextBox, fooService, fooString.
블루

3
@ wuub : 적절한 이름을 지정하면 접두사를 붙일 필요가 없다고 주장합니다.
케니 만

4
그건 그렇고 당신이 언급 한 것은 실제 헝가리어가 아닙니다.
Antony Carthy

67

"완벽한"아키텍처

저는 몇 년 전에 THE 아키텍처를 생각해 냈습니다 . 100 % 느슨하게 결합 된 레이어, 광범위한 델리게이트 사용, 경량 오브젝트가되도록 기술적으로 최대한 밀어 붙였습니다. 기술의 천국이었습니다.

그리고 그것은 쓰레기였습니다. 아키텍처의 기술적 순수성은 결과에 대한 완벽 함을 목표로 개발 팀의 속도를 늦추고 거의 완전한 실패를 달성했습니다.

이제 기술적으로 완벽하지 않은 아키텍처가 훨씬 단순 해졌고 제공 속도가 급증했습니다.


57

카페인 사용. 그것은 한때 나를 깨우고 영광스러운 프로그래밍 분위기로 유지했습니다. 이제는 아무 일도하지 않으며, 없으면 두통이 생깁니다.


55
더 많은 커피를 마셔야합니다. 그래도 효과가 없으면 담배를 피우십시오.
MusiGenesis

7
Brad : Python이있는 경우에는 필요하지 않습니다. xkcd.com/353
Peter

멋진 크리스마스 스토리 참조! :-)
Steve Echols

2
나는 습관을 깼다가 다시 몇 번 배웠다 (이제 세 번째주기이다). 추운 아침에 따뜻한 커피 머그잔으로 코딩하는 것만 큼 좋은 것은 없습니다!
Matthew Iselin

15
"암페타민을 끊기 위해 잘못된 주를 선택한 것 같습니다."
ShreevatsaR

50

코드 주석 처리. 나는 코드가 소중하고 자신이 만든 아름다운 보석을 삭제할 수 없다고 생각했습니다. 이제는 주석 처리 된 코드를 삭제합니다. 주석 처리 된 코드는 그대로두기에는 너무 위험하기 때문에 첨부 된 TODO 또는 NOTE가없는 경우 삭제합니다. 재치로, 주석 처리 된 부분이 많은 오래된 클래스를 보았는데 왜 그런지 혼란 스러웠습니다. 거기에 있었습니까 : 그들은 최근에 주석을 달았습니까? 이것은 개발 환경 변경입니까? 이 무관 한 차단을하는 이유는 무엇입니까?

코드를 주석 처리하지 않고 대신 삭제하는 것을 진지하게 고려하십시오. 필요한 경우 여전히 소스 제어에 있습니다. 그래도 YAGNI.


6
리팩토링 중에 이전 코드를 주석 처리하지만 대체 코드가 작동하는지 확인할 때까지만 주석 처리합니다. 새 버전이 완전히 작동하면 이전 주석 줄을 삭제합니다.
muusbolla

사실-나는 또한 코드를 주석 처리하지만 며칠 동안 만 사용합니다. 내가 돌아와서 내가 놓친 부분이 있다는 것을 깨달았다면 새 코드가 작동하기 전에 삭제됩니다.
Colin Mackay

4
주석이 달린 코드를 한 번 확인하고 삭제하십시오. 거기 당신은 코드의 여러 다른 비트를 테스트 여러 번, 그리고 당신이 깨진 코드를 확인하고 싶지 않아 ...
DisgruntledGoat

버전 관리가 친구라는 것은 말할 것도 없습니다.
David Thornley

+1 나는 그가 리팩토링하거나 재 작성한 모든 코드 에 대해 주석을달라고 주장하는 프로그래머와 함께 일했습니다 . 때로는 내가 작업중인 것을 찾기 위해 1k 개 이상의 쓰레기 줄을 스크롤해야하기 때문에 나를 미치게 만들 것입니다.
에반 가자미

46

#region 지시문의 남용 / 남용. 사소한 일이지만 C #에서는 이전에 클래스를 구성하기 위해 #region 지시문을 모든 곳에서 사용했습니다. 예를 들어 모든 클래스 속성을 한 지역에 함께 그룹화합니다.

이제 나는 오래된 코드를 되돌아보고 대부분 그저 짜증이납니다. 나는 그것이 정말로 대부분의 경우 일을 더 명확하게 해주지 않는다고 생각하며 때때로 그들은 당신을 느리게 만듭니다. 그래서 나는 이제 마음을 바꾸었고 잘 짜여진 클래스가 지역 지시 없이 대부분 깨끗하다고 ​​느낍니다 .


31
나는 지역이 싫어. 우리 팀의 사람들은 그것들을 경솔하게 사용합니다. 나는 그들을 "나쁜 코드 숨김"이라고 부른다.
rball

9
확실히 코드 냄새입니다.
Frank Schwieterman

3
나는 지역을 싫어한다. 저는 현재 기능이 거의 500 줄인 코드를 유지하고 있으며이를 관리하기 위해 현명한 개발자는 10 ~ 15 개의 지역에 코드 덩어리를 배치했습니다.
SolutionYogi

6
@Solution 요기 : 나는 지역이 :-) 귀하의 경우 진짜 문제 생각하지 않는다
에드 S.

9
드물게 사용하면 영역이 괜찮을 수 있다고 생각합니다.
Gregory Higley

39

일반적으로 폭포 개발, 구체적으로는 완전하고 포괄적 인 기능 및 디자인 사양을 작성하는 관행으로, 어떻게 든 정식이 될 것으로 예상되고 그 구현이 정확하고 수용 가능할 것으로 기대합니다. 나는 그것이 스크럼으로 대체되는 것을 보았습니다. 단순한 사실은 고객의 요구와 욕구의 변화하는 특성으로 인해 고정 된 사양을 효과적으로 쓸모 없게 만든다는 것입니다. 문제에 제대로 접근하는 유일한 방법은 반복적 인 접근 방식입니다. 물론 스크럼이 은색 총알은 아닙니다. 나는 그것이 오용되고 남용되는 것을 여러 번 보았다. 그러나 그것은 폭포를 이깁니다.


3
내 고객에게 말 해주세요 ... 쓸모없는 "나는 수정 구슬을 가진 프로그래머이므로 6 개월 안에 저수준 디자인이 어떻게 보일지 정확히 알고 있습니다"사양 문서를 작성하는 중입니다. :)
Igor Brejc

36

충돌하지 않습니다.

좋은 생각 같지 않나요? 사용자는 충돌하는 프로그램을 좋아하지 않으므로 충돌하지 않는 프로그램을 작성하고 사용자는 프로그램을 좋아해야합니다. 그것이 내가 시작한 방법입니다.

요즘 나는 그것이 작동하지 않으면 작동하는 척해서는 안된다고 생각하는 경향이 있습니다. 좋은 오류 메시지와 함께 가능한 한 빨리 실패하십시오. 그렇지 않으면 프로그램은 나중에 몇 가지 명령만으로도 충돌이 심해지지만 디버그하는 데 한 시간이 걸리는 설명이없는 널 포인터 오류가 발생합니다.

내가 가장 좋아하는 "충돌 방지"패턴은 다음과 같습니다.

public User readUserFromDb(int id){
    User u = null;
    try {
        ResultSet rs = connection.execute("SELECT * FROM user WHERE id = " + id);
        if (rs.moveNext()){
            u = new User();
            u.setFirstName(rs.get("fname"));
            u.setSurname(rs.get("sname"));
            // etc
        }
    } catch (Exception e) {
        log.info(e);
    }
    if (u == null){
        u = new User();
        u.setFirstName("error communicating with database");
        u.setSurname("error communicating with database");
        // etc
    }
    u.setId(id);
    return u;
}

이제 사용자에게 오류 메시지를 복사 / 붙여 넣기하도록 요청하고이를 사용자에게 보내는 대신 로그 항목을 찾으려고 로그를 살펴 봐야합니다. (유효하지 않은 사용자 ID를 입력했기 때문에 로그 항목이 없습니다.)


사용자가 실제 오류 메시지를 제공 할 가능성과 로그에서 문제를 생성 할 가능성은 무엇입니까? (이 특별한 경우에는 매우 낮지 만 사용자는 오류 메시지를 거의 인용하지 않습니다!) 그들은 심지어 그것을 읽습니까?
Arafangion 2009

1
임의의 사용자가 오류 메시지를 보낼 가능성은 낮지 만 기회는 0이 아니며 (사소한 예 : 때로는 자신의 앱을 사용함) 일부 사용자는 복사 / 붙여 넣기 할 내용을 시간이 지남에 따라 실제로 학습합니다. 나는 당신이 (당신이해야) 로그인하지 말아야 말하는 게 아니에요,하지만 응용 프로그램이 깨진 경우, 그것은 됩니다 깨진. 오류 메시지를 표시하는 것이 사용자의 이름이 "데이터베이스와 통신하는 동안 오류가 발생했습니다"(또는 더 나쁘거나 null빈 문자열) 인 것처럼 가장하는 것보다 훨씬 낫고 사용자에게 훨씬 더 정직합니다 .
gustafc 2009

선 두에있는 NullReferenceException이있다
oɔɯǝɹ

감사합니다, oɔɯǝɹ, 내가 고쳤습니다. (그것과 비트 lulzier했지만이 :이 모든 않도록 예외 및 기타 "충돌"에 대한 문제, 그리고 아직도 무조건 추락했다.)
gustafc

33

디자인 패턴을 알아볼 때마다 적용하는 것이 합리적이라고 생각했습니다 .

내가 실제로 외국 프로그래밍 언어에서 스타일을 복사하고 있다는 사실을 거의 알지 못했지만, 내가 사용하는 언어는 훨씬 더 우아하고 쉬운 솔루션을 허용했습니다.

여러 (매우) 다른 언어를 사용하여 눈을 뜨고 다른 사람들의 해결책을 내 문제가 아닌 문제에 잘못 적용 할 필요가 없다는 것을 깨달았습니다. 이제 Ruby와 같은 언어로 적용된 팩토리 패턴을 보면 떨립니다.


2
루비에 대한 내 무지 함을 용서해주십시오. 그런데 왜 우리는 그것과 함께 팩토리 패턴을 사용하지 말아야합니까?
Mike Chamberlain 2011 년

여기서 루비 스트는 아니지만, 팩토리는 구현에 따라 피하는 것이지만 루비는 동적이며 무엇이든 모의하거나 스텁 할 수 있습니다. 따라서 실제로 구현에 의존하지 않습니다.
Stéphane 2011 년

27

강박 테스트. 나는 테스트 우선 개발의 광적인 지지자였습니다. 일부 프로젝트의 경우 이는 많은 의미가 있지만, 모든 단일 기능에 대해 단위 테스트를 작성하는 교리를 엄청나게 고수하는 것이 실행 불가능할뿐만 아니라 많은 프로젝트에 해롭다는 것을 깨달았습니다.

사실, 무엇이든 몹시 고수하는 것은 해로울 수 있습니다.


22
따개비에는 꽤 잘 작동합니다.
MusiGenesis

테스트 범위는 혜택에 비례해야합니다. 당신이 실제로하는 모든 일이 이익을 보여 주어야합니다. 100 % 커버리지는 그다지 많은 것을주지는 않습니다. 생명 유지 장치 / 미사일 발사 시나리오에없는 형태로 80 또는 90과 차이가 있습니다.
Spence

테스트가 아닌 단위 테스트에 대한 의존도는 +1입니다.
Preet Sangha

25

이것은 작은 일이지만 : 중괄호가 어디로 가는지 (같은 줄 또는 다음 줄에서?) 신경 쓰고, 코드의 최대 줄 길이, 변수에 대한 명명 규칙 및 기타 스타일 요소를 제안했습니다. 모든 사람이 나보다 이것에 더 신경을 쓰는 것 같아서 요즘 같이 일하는 사람의 흐름을 따라갑니다.

편집 : 물론 내가 가장 신경 쓰는 사람 일 때 (또는 그룹의 스타일을 설정하는 위치에있는 사람 일 때) 예외입니다. 그럴 때는 내가 원하는대로 해!

(이것은 일관된 스타일이없는 것과는 다릅니다. 코드베이스에서 일관된 스타일이 가독성을 위해 매우 중요하다고 생각합니다.)


5
누군가 이것을 반대표를 주었지만 나는 그것이 실용적인 관점이라고 생각합니다. 최고의 코드 스타일은 무엇입니까? 중요하지 않습니다. 같은 파일에서 위아래로 찾아 복제하십시오.
Frank Schwieterman

12
최고의 코드 스타일링은 해당 상점의 표준이 무엇이든 상관 없습니다.
David Thornley

그래서 저는 Visual Studio의 자동 서식 옵션을 좋아합니다. 다른 개발자가 코드를 어떻게 작성했는지는 중요하지 않습니다. 제가 빠른 형식을 작성하고 정확히 제가 좋아하는 방식입니다. 대부분의 경우.
corymathews

5
@cory : 방금 다시 포맷 한 파일의 버전 간의 차이를 보여주는 버전 제어 소프트웨어의 기능이 엉망이되지 않습니까?
Steve Melnikoff 2009

그래서 제가 파이썬을 배우는 것에 매력을 느낍니다. 제 탭 스톱이 무엇으로 설정되어 있는지 걱정해야하고 스타일을 보강하는 것이 아니라고 생각합니다. 그것은 일종의 설득력이 있습니다.
Chris K

24

아마도 내가 마음을 바꾼 가장 중요한 "프로그래밍 관행"은 내 코드가 다른 모든 사람보다 낫다는 생각 일 것입니다. 이것은 프로그래머 (특히 초보자)에게 일반적입니다.


20

유틸리티 라이브러리. 나는 언젠가 다른 곳에서 사용할 수 있다는 이론과 함께 다양한 도우미 메서드와 클래스로 어셈블리를 가지고 다녔습니다.

실제로는 제대로 구성되지 않은 기능이 많은 거대한 네임 스페이스를 방금 만들었습니다.

이제 저는 그것들을 제가 만든 프로젝트에 그대로 둡니다. 모든 가능성에있어서 저는 그것을 필요로하지 않을 것입니다. 그리고 만약 필요하다면 나중에 재사용 가능한 것으로 리팩토링 할 수 있습니다. 때로는 공통 어셈블리로 추출 할 수 있도록 // TODO로 플래그를 지정합니다.


12
"동일한 문제를 세 번 해결해야 할 때까지 일반적인 루틴을 만드는 것에 대해 생각조차하지 마십시오."라는 문구가있는 좋은 인용문 (현재 원본을 찾을 수 없습니다)이 있습니다.
DaveR

9
"Three strikes and you refactor" -Martin Fowler의 리팩토링 . The Rule of Three , pg 58.
Nick Dandoulakis 2009

20

내가 코딩 한 것보다 더 많은 것을 디자인합니다. 잠시 후 분석 마비로 바뀝니다.


44
나는 가끔 "당신이 너무 많이 생각하고 있다는 것을 알게되면 멈추고 실행하라. 당신이 너무 많이하고 있다는 것을 발견하면 멈추고 생각하라."
Neil N

좋지만 너무 많으면 얼마입니까?
Hamish Grubijan 2010 년

UML (Useless Modeling Language)에 너무 많이 의존합니다. 그것은 때때로 그 용도가있다. 그러나 누군가가 클래스 다이어그램을 그리기 시작하고 "다이어그램에서 코드를 생성하는 것이 얼마나 멋진 지"의 이점에 대해 설교하는 것을 보면 저는 운동화를 묶습니다. 또한 Visual Studio에는 모든 작업을 자동으로 수행하고 크랙시 개체 탐색기처럼 작동하는 대화 형 클래스 다이어그램 생성기가 내장되어 있습니다.
에반 가자미

15

데이터 세트를 사용하여 비즈니스 논리를 수행합니다. 이것은 코드를 데이터베이스에 너무 빡빡하게 묶고, 또한 DataSet은 일반적으로 SQL에서 생성되어 상황을 더욱 취약하게 만듭니다. SQL 또는 데이터베이스가 변경되면 DataSet이 접촉하는 모든 것으로 흘러가는 경향이 있습니다.

개체 생성자 내에서 비즈니스 논리를 수행합니다. 상속과 오버로드 된 생성자를 만드는 기능은 유지 관리를 어렵게 만드는 경향이 있습니다.


15

축약 변수 / 메서드 / 테이블 / ... 이름

이름의 길이에 대한 제한이없는 언어로 작업 할 때에도 항상이 작업을 수행했습니다 (아마도 255 개 정도 였을 것입니다). 부작용 중 하나는 (비표준) 약어를 설명하는 코드 전체에 흩어져있는 많은 주석이었습니다. 물론 어떤 이유로 든 이름이 변경된 경우 ...

이제 나는 좋은 설명적인 이름을 사용하여 진짜라고 부르는 것을 선호합니다. 표준 약어 만 포함 합니다. 쓸모없는 주석을 포함 할 필요가 없으며 코드가 훨씬 더 읽기 쉽고 이해하기 쉽습니다.


예, 다음 유형의 선언을 좋아해야합니다 : void Foo (x1, y, x2, y2, p, r, j) ... WTF ?!
Ed S.

또는 더 나쁘거나 (예, 실제로 본 적이 있습니다) Foo(int arg0, String arg1, float arg2)
Mac

14

엔터프라이즈 라이브러리와 같은 기존 데이터 액세스 구성 요소를 도우미 메서드의 사용자 지정 계층으로 래핑합니다.

  • 누구의 삶을 더 쉽게 만들지 않습니다
  • 버그가있을 수있는 더 많은 코드
  • 많은 사람들이 EntLib 데이터 액세스 구성 요소를 사용하는 방법을 알고 있습니다. 현지 팀 외에는 아무도 사내 데이터 액세스 솔루션을 사용하는 방법을 알고 있습니다.

14

1984 년 스몰 토크를 읽다가 객체 지향 프로그래밍에 대해 처음 들었지만 1992 년 cfront C ++ 컴파일러를 사용하기 전까지는 oo 언어에 접근 할 수 없었습니다. 마침내 1995 년에 스몰 토크를 사용하게되었습니다. 저는 oo를 기대했습니다. 소프트웨어 개발을 절약 할 수 있다는 아이디어를 얻었습니다.

이제 저는 oo를 몇 가지 장점이있는 하나의 기술로 간주하지만 도구 상자에서 하나의 도구에 불과합니다. 나는 대부분의 작업을 파이썬으로하고, 종종 클래스 멤버가 아닌 독립형 함수를 작성하고, 종종 과거에 클래스를 만들었던 튜플이나 목록에 데이터 그룹을 수집합니다. 데이터 구조가 복잡하거나 데이터와 관련된 동작이 필요한 경우에도 클래스를 생성하지만 저항하는 경향이 있습니다.

나는 시간이있을 때 Clojure에서 어떤 작업을하는 데 실제로 관심이 있는데, oo 기능을 제공하지 않지만 올바르게 이해하면 Java 객체를 사용할 수 있습니다. oo가 죽었다고 말할 준비가 안됐는데 개인적으로 예전 팬이 아니에요.


13

C #에서 _notation 개인 멤버에 합니다. 나는 지금 그것이 추악하다고 생각합니다.

그런 다음 this.notation개인 회원으로 변경 했지만 사용에 일관성이 없어서 그만 두었습니다.


29
나는 여전히 _notation을 사용하고 있으며 그것이 훌륭하다고 생각합니다.
Arnis Lapsa

3
나는 _notation을 싫어한다. 공개 멤버에게는 ThisNotation을, 비공개 멤버에게는 thisNotation을 사용합니다.
Callum Rogers

나도 싫어. 그것은 :( 나에게 혼란
Broken_Window

4
동의하지 않습니다. 이름을 훨씬 쉽게 관리 할 수 ​​있습니다. 속성 또는 공용 / 내부 멤버에는 PascalCase를 사용하고 속성을 통해 노출되는 멤버에는 _UnderscorePascalCase를 사용하고 메서드 / 생성자 및 개인 멤버의 매개 변수 이름에는 camelCase를 사용합니다. 'this'키워드는 클래스 외부의 현재 클래스 참조를 전달해야하거나 클래스 내에서 자동 생성 된 멤버 (예 : 이름, 컨트롤 등)에 액세스해야하는 경우에만 필요합니다.
에반 가자미

@Evan : 나는 마지막 부분을 제외하고는 당신이 설명하는 것을 정확하게합니다. 메서드와 속성을 호출 할 때 this또는 Me(각각 C # 및 VB.NET) 을 사용하는 경향이 있습니다. IMO, 특히 특정 범위 내에 4 개 이상의 객체가있는 경우 나중에 코드를 읽고 이해하기가 더 쉽습니다.
Alex Essilfie

11

구현하기 전에 대학에서 권장하는 디자인 방법을 중단했습니다. 혼란스럽고 복잡한 시스템에서 일하면서 태도를 바꿔야했습니다.

물론 저는 여전히 코드 연구를하고 있습니다. 특히 이전에 한 번도 다루지 않은 코드를 만질 때, 일반적으로 저는 먼저 무언가를 시작하기 위해 가능한 한 작은 구현에 집중하려고합니다. 이것이 주요 목표입니다. 그런 다음 점차 논리를 다듬고 디자인이 저절로 나타나도록합니다. 프로그래밍은 반복적 인 프로세스입니다. 이며 민첩한 접근 방식과 많은 리팩토링으로 매우 잘 작동합니다.

코드는 처음에 생각했던 모든 것을 보지 않습니다. 매번 일어난다 :)


10

나는 계약에 의한 설계에 큰 관심을 보였습니다. 이것은 내 모든 기능의 시작 부분에 많은 오류 검사를 두는 것을 의미했습니다. 관심사 분리의 관점에서 계약은 여전히 ​​중요하지만 코드가 수행하지 않아야하는 작업을 시행하기보다는 단위 테스트를 사용하여 수행하는 작업을 확인하려고합니다.


나는 이와 같은 프로그램을 배웠다. 물론 고교 수학 선생님이 가르쳐 주셨 기 때문에 그가 자신의 기능을 모두 스스로 검증하기를 원했던 것 같습니다.
Alex

10

더 간결하기 때문에 많은 메서드 / 클래스에서 정적을 사용합니다. 시험을 쓰기 시작했을 때 연습이 매우 빠르게 바뀌 었습니다.


10

확인 된 예외

종이에 대한 놀라운 아이디어-계약을 명확하게 정의하고 실수의 여지가 없으며 일부 예외 조건을 확인하는 것을 잊었습니다. 처음 들었을 때 팔렸다.

물론 실제로는 그렇게 엉망이되었습니다. 레거시 검사 예외를 주요 기능 중 하나로 숨기는 Spring JDBC와 같은 라이브러리를 오늘날 가지고있는 시점까지.


9

가치있는 것은 하나의 특정 언어로만 코딩되었습니다. 제 경우에는 C가 최고의 언어라고 믿었고 다른 언어로 코딩 할 이유가 없었습니다.

그 이후로 다양한 언어와 그 언어가 제공하는 이점 / 기능에 감사하게되었습니다. 작은 것을 빠르게 코딩하려면 Python을 사용합니다. 대규모 프로젝트에서 작업하려면 C ++ 또는 C #으로 코딩합니다. 뇌종양을 개발하고 싶다면 Perl로 코딩 합니다.


8

리팩토링을해야했을 때 바로 시작하여 새로운 디자인을 구현하고 작동 할 때까지 연결을 수정하는 것이 더 빠르고 깔끔하다고 생각했습니다. 그런 다음 새 디자인을 향해 느리지 만 안정적으로 진행하기 위해 일련의 작은 리팩토링을 수행하는 것이 더 낫다는 것을 깨달았습니다.


횟수를 기억이 조금 나 ....이
Preet 승가

8

아마도 내 코딩 관행과 다른 것에서 변경된 가장 큰 것은 인터넷에서 다운로드 한 외부 클래스와 라이브러리를 응용 프로그램의 동작과 기능에 대한 기반으로 받아들이는 것입니다. 내가 대학에 다닐 때 학교에서 우리는 우리 자신의 코드를 통해 상황을 개선하고 문제를 해결하기 위해 언어에 의존하는 방법을 알아 내도록 격려 받았습니다. 사용자 인터페이스 및 서비스 / 데이터 소비의 모든 측면이 발전함에 따라 이것은 더 이상 현실적인 개념이 아닙니다.

언어에서 절대 변경되지 않는 특정 사항이 있으며,이 코드를 더 간단한 트랜잭션과 적은 수의 코드 줄로 감싸는 라이브러리를 갖는 것은 축복입니다. 데이터베이스에 연결하는 것은 항상 동일합니다. DOM 내에서 요소를 선택해도 변경되지 않습니다. 서버 측 스크립트를 통해 이메일을 보내는 것은 변경되지 않습니다. 이 시간을 반복해서 작성해야하는 것은 애플리케이션의 핵심 로직을 개선하는 데 사용할 수있는 시간을 낭비합니다.


7

모든 클래스 멤버를 초기화합니다.

나는 모든 클래스 멤버를 일반적으로 NULL로 명시 적으로 초기화했습니다. 나는 이것을 깨달았다 :

  • 일반적으로 모든 변수는 읽기 전에 두 번 초기화됩니다.
  • 대부분의 언어에서 자동으로 변수를 NULL로 초기화하기 때문에 바보입니다.
  • 실제로 대부분의 언어에서 약간의 성능 저하를가합니다.
  • 더 큰 프로젝트에서 코드를 부 풀릴 수 있습니다.

4
때때로 모든 클래스 멤버를 초기화하지 않은 결과는 실제로 a $$에 물릴 수 있습니다.
muusbolla

복제를 통해 새 인스턴스를 만드는 프로토 타입 기반 언어를 사용하지 않는 한. 모든 멤버를 초기화하면 많은 수고를 덜 수 있습니다.
Wojciech Bederski

6

여러분과 마찬가지로 저도 앱의 다양한 구성 요소 간의 결합을 줄이는 데 IoC 패턴을 수용했습니다. 각 구성 요소를 가능한 한 독립적으로 유지할 수있는 한 유지 관리 및 부품 교체가 훨씬 간단 해집니다. 또한 데이터베이스 관리 작업을 단순화하기 위해 NHibernate와 같은 더 많은 객체 관계형 프레임 워크를 활용하고 있습니다.

간단히 말해서 "미니"프레임 워크를 사용하여 소프트웨어를보다 빠르고 효율적으로 구축 할 수 있습니다. 이러한 미니 프레임 워크는 많은 시간을 절약하고 올바르게 수행하면 애플리케이션을 매우 간단하게 유지 관리 할 수 ​​있습니다. 승리를위한 플러그 앤 플레이!


-1 IoC와 프레임 워크의 확산을 견딜 수 없습니다. 좋은 IOC의 및 프레임 워크 = 불필요한 복잡성 디커플링
폴 홀 링스 워스

디커플링을 칭찬하면서도 여전히 IoC 및 기타 프레임 워크를 싫어할 수 있습니까? 이것이 바로 많은 IoC 프레임 워크와 디자인 패턴이 시작하는 일입니다.
ajawad987
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.