Thực hành lập trình nào mà bạn từng thích kể từ khi bạn thay đổi ý định? [đóng cửa]


99

Khi chúng tôi lập trình, tất cả chúng tôi đều phát triển các phương pháp và mẫu mà chúng tôi sử dụng và dựa vào. Tuy nhiên, theo thời gian, khi sự hiểu biết, sự trưởng thành và thậm chí cả cách sử dụng công nghệ của chúng ta thay đổi, chúng ta nhận ra rằng một số phương pháp mà chúng ta từng cho là tuyệt vời đã không (hoặc không còn được áp dụng).

Một ví dụ về một thực hành mà tôi đã từng sử dụng khá thường xuyên, nhưng đã thay đổi trong những năm gần đây, đó là việc sử dụng mẫu đối tượng Singleton .

Thông qua kinh nghiệm của bản thân và các cuộc tranh luận lâu dài với các đồng nghiệp, tôi nhận ra rằng các singlelet không phải lúc nào cũng mong muốn - chúng có thể làm cho việc thử nghiệm khó khăn hơn (bằng cách ức chế các kỹ thuật như chế nhạo) và có thể tạo ra sự kết hợp không mong muốn giữa các phần của hệ thống. Thay vào đó, bây giờ tôi sử dụng các nhà máy đối tượng (thường là với một IoC container) để che giấu bản chất và sự tồn tại của các singleton khỏi các phần của hệ thống mà không cần quan tâm - hoặc cần biết. Thay vào đó, họ dựa vào một nhà máy (hoặc bộ định vị dịch vụ) để có được quyền truy cập vào các đối tượng như vậy.

Những câu hỏi của tôi đối với cộng đồng, với tinh thần tự hoàn thiện, là:

  • Gần đây bạn đã xem xét lại những mẫu hoặc thực hành lập trình nào và bây giờ cố gắng tránh?
  • Bạn đã quyết định thay thế chúng bằng gì?

Câu trả lời:


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. Tôi đã về để đăng cùng một câu trả lời này. Tôi đã tìm thấy một số bài tập lập trình cũ của mình trên một đĩa lưu trữ cách đây vài tuần. Tất cả đều giống nhau. Gần như tỷ lệ dòng nhận xét trên dòng mã là 1: 1.
Michael Moussa 07/07/09

32
Nghe có vẻ như bạn nhận xét không đúng , không quá đáng. Mã không nói cho chính nó. Không. Nó thực sự không. Đọc NT Insider mới nhất để biết thêm thông tin hay về điều này. Nếu bạn nghĩ rằng nhận xét sẽ là thừa thì bạn đã sai hoặc bạn đang làm sai. Có vẻ như các trường đại học không dạy bình luận đúng (hoặc theo dõi lỗi, hoặc kiểm soát phiên bản ... * thở dài *). Có quá ít bình luận ngoài kia. (và ít những người tốt)
Thomas

5
Code Complete có các mẹo hay về nhận xét và dữ liệu để sao lưu.
Thomas,

20
Nhận xét nên được sử dụng để mô tả lý do tại sao mã làm những gì nó làm (nếu nó không rõ ràng), chứ không phải những gì mã làm. Một trường hợp ngoại lệ có thể xảy ra là một vụ hack ngôn ngữ / twiddling hơi điên rồ, như số ma thuật 0x5f3759df của Carmack.
Chris Simmons

6
@Thomas: Cá nhân tôi nghĩ vấn đề là dạy bình luận tốt không phải là thứ mà một trường đại học có thể chỉ cho sinh viên. Hầu hết tất cả các chương trình tại các trường học chỉ là một lần duy nhất; sinh viên không có kinh nghiệm nhìn lại mã họ đã viết một năm trước và không hiểu nó chút nào. Ngoài ra, các lớp học cấp thấp hơn dạy các khái niệm mã hóa thực sự đơn giản - việc bình luận ở cấp độ này gần như nhất thiết phải tẻ nhạt, vì những gì đang xảy ra. Nói cách khác, nó giống như cố gắng dạy ai đó bơi trong hồ bơi; nó không phải là bối cảnh phù hợp để họ hiểu các chuyển động.
Dan Lew

117

Điểm trở lại duy nhất.

Tôi đã từng ưa thích một điểm quay lại duy nhất cho mỗi phương pháp, bởi vì với điều đó, tôi có thể đảm bảo rằng mọi thao tác dọn dẹp cần thiết theo quy trình đều không bị bỏ qua.

Kể từ đó, tôi đã chuyển sang các quy trình nhỏ hơn nhiều - vì vậy khả năng bỏ qua việc dọn dẹp giảm đi và trên thực tế, nhu cầu dọn dẹp cũng giảm - và nhận thấy rằng việc trả về sớm làm giảm độ phức tạp rõ ràng (mức lồng ghép) của mã. Các phần tử của điểm trả về duy nhất - giữ các biến "kết quả" xung quanh, giữ các biến cờ, mệnh đề điều kiện cho các tình huống chưa thực hiện - làm cho mã có vẻ phức tạp hơn nhiều so với thực tế, khiến nó khó đọc và khó bảo trì hơn. Các lối thoát sớm và các phương pháp nhỏ hơn, là cách để đi.


3
Tôi đồng ý, khi kết hợp với các kiểu dữ liệu tự động làm sạch vươn lên dẫn trước, chẳng hạn như autoptr, scoped_ptr, CComPtr vv
i_am_jorf

3
Mã sạch lên là những gì try {} finally {} là cho
banjollity

@banjollity: ngoại trừ các ngôn ngữ cuối cùng không hỗ trợ {}. Và lưu ý rằng ngay cả trong các ngôn ngữ hỗ trợ nó, cuối cùng {} không LUÔN được đảm bảo thực thi.
Chris K,

1
@banjollity, Chris: Trong C ++, dọn dẹp là mục đích của bộ hủy, và ngoại trừ trong những trường hợp khắc nghiệt (exit (), bộ hủy ném ra một ngoại lệ trong quá trình giải phóng ngăn xếp, sóc cắt sức mạnh của bạn) nó được đảm bảo chạy.
David Thornley

4
Đã đồng ý. Thay thế điều kiện lồng nhau bằng điều kiện bảo vệ ftw!
Jonik

111
  • Cố gắng mã hóa mọi thứ một cách hoàn hảo trong lần thử đầu tiên.
  • Cố gắng tạo mô hình OO hoàn hảo trước khi mã hóa.
  • Thiết kế mọi thứ để linh hoạt và cải tiến trong tương lai.

Trong một từ khai thác quá mức .


6
Chờ đã, tôi luôn hiểu ngay trong lần thử đầu tiên. :)
i_am_jorf

18
Tiền thật là do nó sai một cách tinh vi ngay lần đầu tiên và để nó ra ngoài tự nhiên. Sau đó, khi mọi người đã quen với phiên bản gimp, hãy lao vào với kỹ năng biểu diễn kiêu ngạo và sửa lỗi / sự kém hiệu quả để gặt hái thêm vinh quang! ;)
Eric

7
@jeffamaphone - Không, chỉ Jon Skeet mới hiểu được ngay lần đầu tiên.
Jordan Parmer

Tôi thích từ "khai thác quá mức"
Neilvert Noval

@jeffamaphone - Tôi cũng luôn hiểu ngay trong lần thử đầu tiên. Nhưng những nỗ lực xa hơn mang lại những gì tôi cần :)
umbr

78

Ký hiệu Hungary (cả Dạng và Hệ thống). Tôi đã sử dụng tiền tố mọi thứ. strSomeString hoặc txtFoo. Bây giờ tôi sử dụng someString và textBoxFoo. Nó dễ đọc hơn và dễ dàng hơn cho một người mới đến và chọn. Như một phần thưởng bổ sung, việc giữ cho nó luôn nhất quán là điều nhỏ nhặt - camelCase kiểm soát và thêm một tên hữu ích / mô tả. Hình thức Hungary có nhược điểm là không phải lúc nào cũng nhất quán và Hệ thống Hungary không thực sự thu được nhiều lợi ích của bạn. Việc gộp tất cả các biến lại với nhau không thực sự hữu ích - đặc biệt là với IDE hiện đại.


Còn đối với các ngôn ngữ được gõ động, chẳng hạn như Python hoặc JavaScript thì sao? Tôi vẫn thấy hữu ích khi sử dụng ký hiệu tiếng Hungary trong các ngôn ngữ này để khi nhìn vào các biến, tôi biết loại biến nào được mong đợi (nếu có một loại để mong đợi - tất nhiên, sẽ thật khó nếu xử lý một ngôn ngữ được nhập động chính xác như một ngôn ngữ được nhập tĩnh.)
Dan Lew

4
Tôi làm tương tự ngoại trừ: fooTextBox và chuỗi chỉ là hy vọng rõ ràng: numberOfEntries => int, isGreat => bool, v.v.
rball

+1 để loại bỏ ký hiệu Hungary. Tôi đồng ý với rball; fooTextBox, fooService, fooString khi thực sự cần thiết.
blu

3
@ wuub: Tôi lập luận rằng với cách đặt tên phù hợp, bạn không cần phải thêm tiền tố.
Kenny Mann

4
Nhân tiện những gì bạn đề cập không phải là người hung hãn thực sự.
Antony Carthy,

67

Kiến trúc "hoàn hảo"

Tôi đã nghĩ ra kiến trúc THE cách đây vài năm. Đã thúc đẩy bản thân về mặt kỹ thuật hết mức có thể để có 100% các lớp được ghép nối lỏng lẻo, sử dụng rộng rãi các đại biểu và các đối tượng nhẹ. Đó là thiên đường kỹ thuật.

Và nó là tào lao. Sự thuần khiết về mặt kỹ thuật của kiến ​​trúc chỉ khiến nhóm nhà phát triển của tôi chậm lại mục tiêu hướng đến sự hoàn hảo hơn là kết quả và tôi gần như đã thất bại hoàn toàn.

Giờ đây, chúng tôi có kiến ​​trúc đơn giản hơn ít hoàn hảo về mặt kỹ thuật hơn nhiều và tỷ lệ phân phối của chúng tôi đã tăng vọt.


57

Việc sử dụng caffine. Nó đã từng khiến tôi tỉnh táo và ở trong tâm trạng lập trình vui vẻ, nơi mà mã bay khỏi ngón tay tôi với sự uyển chuyển đáng kinh ngạc. Bây giờ nó không làm gì cả, và nếu tôi không có nó, tôi sẽ đau đầu.


55
Bạn cần uống nhiều cà phê hơn nữa. Nếu điều đó không hiệu quả, hãy tiếp tục hút thuốc.
MusiGenesis 07/07/09

7
Brad: Bạn không cần những khi bạn có Python: xkcd.com/353
Peter

Tham khảo câu chuyện Giáng sinh vui vẻ! :-)
Steve Echols

2
Tôi đã phá vỡ thói quen và sau đó lại nhặt nó lên nhiều lần (Bây giờ là chu kỳ thứ ba của tôi). Không gì bằng viết mã vào những buổi sáng lạnh giá với một tách cà phê ấm!
Matthew Iselin,

15
"Có vẻ như tôi đã chọn nhầm tuần để bỏ amphetamine."
ShreevatsaR

50

Nhận xét ra mã. Tôi từng nghĩ rằng mã đó là quý giá và bạn không thể xóa những viên ngọc tuyệt đẹp mà bạn đã tạo ra. Bây giờ tôi xóa bất kỳ mã được nhận xét nào mà tôi gặp trừ khi có một VIỆC CẦN LÀM hoặc LƯU Ý được đính kèm vì quá nguy hiểm để để nó vào. Nói một cách dí dỏm, tôi đã xem qua các lớp cũ với các phần được nhận xét rất lớn và tôi thực sự bối rối tại sao chúng đã ở đó: gần đây họ có bình luận không? đây có phải là một sự thay đổi môi trường phát triển không? tại sao nó làm khối không liên quan này?

Hãy nghiêm túc xem xét việc không bình luận về mã và thay vào đó chỉ xóa nó. Nếu bạn cần, nó vẫn nằm trong kiểm soát nguồn. YAGNI mặc dù.


6
Tôi nhận xét mã cũ trong quá trình tái cấu trúc, nhưng chỉ cho đến khi tôi xác minh rằng mã thay thế hoạt động. Khi phiên bản mới có đầy đủ chức năng, tôi xóa các dòng bình luận cũ.
muusbolla

Thật vậy - tôi cũng bình luận về mã, nhưng chỉ trong vài ngày. Nếu tôi quay lại và nhận ra rằng mình đã bỏ sót một chút, nó sẽ bị xóa trước khi mã mới được hoạt động.
Colin Mackay,

4
Tôi nói kiểm tra mã nhận xét một lần, THÌ xóa nó. Có rất nhiều lần khi bạn kiểm tra bit khác nhau khác nhau của mã, và bạn không muốn kiểm tra trong mã bị phá vỡ ...
DisgruntledGoat

Chưa kể rằng kiểm soát phiên bản là bạn của bạn.
David Thornley

+1 Tôi đã làm việc với một lập trình viên khăng khăng nhận xét tất cả mã mà anh ta đã cấu trúc lại hoặc viết lại. Nó sẽ khiến tôi phát điên vì đôi khi tôi sẽ phải cuộn qua hơn 1 nghìn dòng tào lao để tìm những gì tôi đang làm.
Evan Plaice

46

Việc lạm dụng / lạm dụng các chỉ thị # khu vực. Chỉ là một điều nhỏ, nhưng trong C #, trước đây tôi sẽ sử dụng các lệnh #region ở khắp nơi, để tổ chức các lớp học của mình. Ví dụ: tôi muốn nhóm tất cả các thuộc tính của lớp lại với nhau trong một vùng.

Bây giờ tôi nhìn lại mã cũ và hầu hết chỉ thấy khó chịu bởi chúng. Tôi không nghĩ nó thực sự làm cho mọi thứ rõ ràng hơn hầu hết thời gian, và đôi khi chúng chỉ đơn giản là làm chậm bạn. Vì vậy, bây giờ tôi đã thay đổi suy nghĩ của mình và cảm thấy rằng các lớp học được bố trí tốt hầu hết sẽ sạch hơn mà không có chỉ thị vùng.


31
Tôi ghét của vùng. Những người trong nhóm của tôi sử dụng chúng một cách phù phiếm. Tôi gọi chúng là "những kẻ chạy mã xấu".
rball

9
Chúng chắc chắn là một mùi mã.
Frank Schwieterman

3
TÔI GHÉT các vùng. Tôi hiện đang duy trì mã trong đó chức năng là gần 500 dòng và để quản lý nó, nhà phát triển thông minh đã đặt các đoạn mã trong 10 đến 15 khu vực.
SolutionYogi

6
@Solution Yogi: Tôi không nghĩ rằng các khu vực là vấn đề thực sự trong trường hợp của bạn :-)
Ed S.

9
Tôi nghĩ rằng các khu vực có thể ổn nếu sử dụng một cách tiết kiệm.
Gregory Higley, 07/07/09

39

Phát triển thác nước nói chung và cụ thể, thực hành viết các thông số kỹ thuật thiết kế và chức năng hoàn chỉnh và toàn diện, bằng cách nào đó được mong đợi là chuẩn và sau đó mong đợi việc triển khai các thông số kỹ thuật đó là đúng và được chấp nhận. Tôi đã thấy nó được thay thế bằng Scrum, và tôi nói. Thực tế đơn giản là bản chất thay đổi của nhu cầu và mong muốn của khách hàng làm cho bất kỳ thông số kỹ thuật cố định nào trở nên vô dụng; cách duy nhất để thực sự tiếp cận đúng vấn đề là với cách tiếp cận lặp lại. Tất nhiên, không phải Scrum là một viên đạn bạc; Tôi đã thấy nó bị lạm dụng và lạm dụng rất nhiều lần. Nhưng nó đập thác.


3
Nói điều đó với khách hàng của tôi ... Tôi đang viết một vài thứ vô ích "Tôi là một lập trình viên với quả cầu pha lê nên tôi biết chính xác thiết kế cấp thấp của mình sẽ như thế nào trong 6 tháng nữa" tài liệu đặc tả :)
Igor Brejc, 27/07/09

36

Không bao giờ bị rơi.

Nó có vẻ là một ý tưởng hay, phải không? Người dùng không thích các chương trình bị lỗi, vì vậy chúng ta hãy viết các chương trình không bị lỗi, và người dùng nên thích chương trình, phải không? Đó là cách tôi bắt đầu.

Ngày nay, tôi có xu hướng nghĩ rằng nếu nó không hoạt động, nó không nên giả vờ như nó đang hoạt động. Không thành công ngay khi bạn có thể, với một thông báo lỗi tốt. Nếu bạn không làm như vậy, chương trình của bạn sẽ gặp sự cố thậm chí còn khó hơn chỉ với một vài hướng dẫn sau đó, nhưng với một số lỗi null-pointer nondescript sẽ khiến bạn mất một giờ để gỡ lỗi.

Mẫu "không bị rơi" yêu thích của tôi là:

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;
}

Bây giờ, thay vì yêu cầu người dùng của bạn sao chép / dán thông báo lỗi và gửi cho bạn, bạn sẽ phải đi sâu vào các nhật ký để cố gắng tìm mục nhập nhật ký. (Và vì họ đã nhập ID người dùng không hợp lệ, nên sẽ không có mục nhập nhật ký.)


Khả năng người dùng đưa cho bạn thông báo lỗi thực tế là bao nhiêu so với nhật ký của bạn tạo ra sự cố? (Rất thấp trong trường hợp cụ thể này, nhưng người dùng hầu như không bao giờ trích dẫn các thông báo lỗi!) Họ thậm chí có đọc chúng không?
Arafangion 07/07/09

1
Tôi thừa nhận khả năng là rất thấp khi một người dùng ngẫu nhiên gửi cho bạn thông báo lỗi, nhưng cơ hội là khác 0 (ví dụ nhỏ: đôi khi bạn sử dụng ứng dụng của riêng mình) và một số người dùng tự động tìm hiểu những gì cần sao chép / dán. Tôi không nói rằng bạn không nên đăng nhập (bạn nên), nhưng khi ứng dụng bị hỏng, nó sẽ bị hỏng. Hiển thị một thông báo lỗi tốt hơn, trung thực hơn nhiều đối với người dùng so với việc giả vờ rằng tên của người dùng là "lỗi khi giao tiếp với cơ sở dữ liệu" (hoặc thậm chí tệ hơn, nullhoặc chuỗi trống).
gustafc

Có một NullReferenceException ở dòng hai
oɔɯǝɹ

Cảm ơn, oɔɯǝɹ, tôi đã sửa nó. (Mặc dù đó là một lulzier bit với nó ở đó: Tất cả rắc rối này đến trường hợp ngoại lệ tránh và "tai nạn" khác, và nó vẫn vô điều kiện bị rơi.)
gustafc

33

Tôi nghĩ rằng thật hợp lý khi áp dụng các mẫu thiết kế bất cứ khi nào tôi nhận ra chúng.

Tôi không biết rằng tôi thực sự đang sao chép các kiểu từ các ngôn ngữ lập trình nước ngoài, trong khi ngôn ngữ mà tôi đang làm việc cho phép tạo ra các giải pháp thanh lịch hơn hoặc dễ dàng hơn nhiều.

Việc sử dụng nhiều (rất) ngôn ngữ khác nhau đã giúp tôi mở rộng tầm mắt và khiến tôi nhận ra rằng tôi không cần phải áp dụng sai giải pháp của người khác cho những vấn đề không phải của mình. Bây giờ tôi rùng mình khi nhìn thấy mô hình nhà máy được áp dụng bằng một ngôn ngữ như Ruby.


2
Xin thứ lỗi cho sự thiếu hiểu biết của tôi về ruby, nhưng tại sao chúng ta không nên sử dụng mô hình nhà máy với nó?
Mike Chamberlain

Ở đây không phải là người theo chủ nghĩa ruby, nhưng nhà máy tránh phụ thuộc vào việc triển khai, nhưng ruby ​​rất năng động, và bạn có thể chế nhạo hoặc khai thác bất cứ thứ gì. Vì vậy, bạn không thực sự phụ thuộc vào việc triển khai.
Stéphane

27

Thử nghiệm ám ảnh. Tôi đã từng là một người đề xuất điên cuồng về sự phát triển trước tiên thử nghiệm. Đối với một số dự án, nó rất có ý nghĩa, nhưng tôi nhận ra rằng nó không chỉ không khả thi mà còn gây bất lợi cho nhiều dự án nếu tuân thủ chặt chẽ một học thuyết về việc viết các bài kiểm tra đơn vị cho mọi phần chức năng.

Thực sự, quá tuân thủ bất cứ điều gì có thể gây hại.


22
Nó hoạt động khá tốt cho các barnacles.
MusiGenesis 07/07/09

Phạm vi kiểm tra phải tỷ lệ thuận với lợi ích. Bất cứ điều gì bạn làm thực sự phải cho thấy một lợi ích. Bảo hiểm 100% sẽ không mang lại cho bạn nhiều như vậy. chênh lệch từ 80 hoặc 90 ở dạng không có trong kịch bản hỗ trợ sự sống / phóng tên lửa.
Spence

+1 sự phụ thuộc vào thử nghiệm đơn vị thay vì thử nghiệm.
Tăng đoàn vào

25

Đây là một việc nhỏ, nhưng: Quan tâm đến vị trí của các dấu ngoặc nhọn (trên cùng một dòng hay dòng tiếp theo?), Độ dài dòng tối đa được đề xuất của mã, quy ước đặt tên cho các biến và các yếu tố khác của kiểu. Tôi nhận thấy rằng mọi người dường như quan tâm đến điều này hơn tôi, vì vậy tôi chỉ đi theo dòng chảy của bất kỳ ai tôi đang làm việc hiện nay.

Chỉnh sửa: Tất nhiên là ngoại lệ khi tôi là người quan tâm nhất (hoặc là người ở vị trí thiết lập phong cách cho một nhóm). Trong trường hợp đó, tôi làm những gì tôi muốn!

(Lưu ý rằng điều này không giống như không có kiểu nhất quán. Tôi nghĩ rằng một kiểu nhất quán trong cơ sở mã là rất quan trọng để dễ đọc.)


5
Ai đó đã phản đối điều này, nhưng tôi nghĩ đó là một góc nhìn thực tế. Kiểu mã tốt nhất là gì? Không quan trọng. Tra cứu trong cùng một tệp và sao chép.
Frank Schwieterman

12
Kiểu mã tốt nhất là bất kể tiêu chuẩn nào dành cho cửa hàng đó.
David Thornley

Đó là lý do tại sao tôi thích các tùy chọn định dạng tự động trong Visual Studio. Không quan trọng các nhà phát triển khác đã viết mã như thế nào, tôi chỉ làm một định dạng nhanh và chính xác cách tôi thích nó ... hầu hết thời gian.
corymathews 07/07/09

5
@cory: điều đó có làm rối khả năng phần mềm kiểm soát phiên bản của bạn hiển thị cho bạn sự khác biệt giữa các phiên bản của tệp mà bạn vừa định dạng lại không?
Steve Melnikoff, 07-07-09

Đó là lý do tại sao tôi bị thu hút bởi việc học python ... để nghĩ rằng tôi chỉ phải lo lắng về những gì các tab của tôi được đặt thành, chứ không phải giằng các kiểu. Đó là loại hấp dẫn.
Chris K,

24

Có lẽ "thực hành lập trình" quan trọng nhất mà tôi đã thay đổi suy nghĩ của mình, đó là ý tưởng rằng mã của tôi tốt hơn những người khác. Điều này là phổ biến đối với các lập trình viên (đặc biệt là người mới).


20

Các thư viện tiện ích. Tôi đã từng mang theo một hội đồng với nhiều phương thức và lớp trợ giúp khác nhau với lý thuyết rằng một ngày nào đó tôi có thể sử dụng chúng ở một nơi khác.

Trên thực tế, tôi vừa tạo một không gian tên khổng lồ với rất nhiều chức năng được tổ chức kém.

Bây giờ, tôi chỉ để chúng trong dự án mà tôi đã tạo ra. Trong tất cả khả năng tôi sẽ không cần nó, và nếu có, tôi luôn có thể cấu trúc lại chúng thành thứ có thể tái sử dụng sau này. Đôi khi tôi sẽ gắn cờ chúng bằng // TODO để có thể trích xuất vào một hội đồng chung.


12
Có một câu trích dẫn hay (tôi không tìm thấy bản gốc tại thời điểm hiện tại) có nội dung "thậm chí đừng nghĩ đến việc tạo một thói quen chung cho đến khi bạn cần giải quyết cùng một vấn đề 3 lần.
DaveR

9
"Ba cuộc đình công và bạn tái cấu trúc" - Refactoring của Martin Fowler. Quy tắc của Ba , pg 58.
Nick Dandoulakis

20

Thiết kế nhiều hơn tôi viết mã. Sau một thời gian, nó chuyển thành tê liệt phân tích.


44
Tôi thỉnh thoảng nhắc đến cụm từ "Nếu bạn thấy rằng bạn đang suy nghĩ quá nhiều, hãy dừng lại và làm. Nếu bạn thấy rằng bạn đang làm quá nhiều, hãy dừng lại và suy nghĩ."
Neil N

Điều đó là tốt, nhưng bao nhiêu là quá nhiều?
Hamish Grubijan

Phụ thuộc quá nhiều vào UML (Ngôn ngữ tạo mô hình vô dụng). Nó đôi khi có những công dụng của nó. Nhưng một khi tôi thấy ai đó bắt đầu vẽ sơ đồ lớp và giảng về lợi ích của việc "tạo mã từ sơ đồ sẽ tuyệt vời như thế nào", tôi buộc dây giày chạy bộ của mình. Thêm vào đó, Visual Studio có một trình tạo sơ đồ lớp tương tác được tích hợp sẵn để thực hiện tất cả tự động và hoạt động giống như trình khám phá đối tượng trên crack.
Evan Plaice

15

Việc sử dụng DataSet để thực hiện logic nghiệp vụ. Điều này liên kết mã quá chặt chẽ với cơ sở dữ liệu, cũng như DataSet thường được tạo từ SQL, điều này làm cho mọi thứ trở nên mong manh hơn. Nếu SQL hoặc Cơ sở dữ liệu thay đổi, nó có xu hướng nhỏ giọt đến mọi thứ mà DataSet chạm vào.

Thực hiện bất kỳ logic nghiệp vụ nào bên trong một hàm tạo đối tượng. Với sự kế thừa và khả năng tạo các constructor quá tải có xu hướng gây khó khăn cho việc bảo trì.


15

Viết tắt tên biến / method / table / ...

Tôi đã từng làm điều này mọi lúc, ngay cả khi làm việc bằng các ngôn ngữ không có giới hạn bắt buộc về độ dài của tên (chúng có thể là 255 hoặc gì đó). Một trong những tác dụng phụ là rất nhiều bình luận rải rác khắp mã giải thích các chữ viết tắt (không chuẩn). Và tất nhiên, nếu tên được thay đổi vì bất kỳ lý do gì ...

Bây giờ tôi thích gọi mọi thứ là thực sự của chúng, bằng những cái tên có tính mô tả tốt. chỉ bao gồm các chữ viết tắt tiêu chuẩn . Không cần bao gồm các bình luận vô ích và mã dễ đọc và dễ hiểu hơn nhiều.


Vâng, bạn phải thích những kiểu khai báo này: void Foo (x1, y, x2, y2, p, r, j) ... WTF ?!
Ed S.

Hoặc tệ hơn (và có, tôi đã thực sự thấy điều này), Foo(int arg0, String arg1, float arg2)vv
Mac

14

Bao bọc các thành phần Truy cập Dữ liệu hiện có, như Thư viện Doanh nghiệp, bằng một lớp tùy chỉnh của các phương thức trợ giúp.

  • Nó không làm cho cuộc sống của bất kỳ ai dễ dàng hơn
  • Nhiều mã hơn có thể có lỗi trong đó
  • Rất nhiều người biết cách sử dụng các thành phần truy cập dữ liệu EntLib. Không ai ngoài nhóm địa phương biết cách sử dụng giải pháp truy cập dữ liệu nội bộ

14

Lần đầu tiên tôi nghe nói về lập trình hướng đối tượng khi đọc về Smalltalk vào năm 1984, nhưng tôi không có quyền truy cập vào ngôn ngữ oo cho đến khi tôi sử dụng trình biên dịch cfront C ++ vào năm 1992. Cuối cùng tôi đã sử dụng Smalltalk vào năm 1995. Tôi đã háo hức mong đợi. công nghệ và ý tưởng rằng nó sẽ tiết kiệm cho việc phát triển phần mềm.

Bây giờ, tôi chỉ thấy oo là một kỹ thuật có một số ưu điểm, nhưng nó chỉ là một công cụ trong hộp công cụ. Tôi thực hiện hầu hết công việc của mình bằng Python và tôi thường viết các hàm độc lập không phải là thành viên của lớp và tôi thường thu thập các nhóm dữ liệu trong các bộ dữ liệu hoặc danh sách mà trước đây tôi đã tạo một lớp. Tôi vẫn tạo các lớp khi cấu trúc dữ liệu phức tạp hoặc tôi cần hành vi liên kết với dữ liệu, nhưng tôi có xu hướng chống lại nó.

Tôi thực sự quan tâm đến việc thực hiện một số công việc trong Clojure khi tôi có thời gian, điều này không cung cấp các phương tiện oo, mặc dù nó có thể sử dụng các đối tượng Java nếu tôi hiểu đúng. Tôi không sẵn sàng để nói bất cứ điều gì như oo đã chết, nhưng cá nhân tôi không phải là người hâm mộ tôi đã từng.


13

Trong C #, sử dụng _notationcho các thành viên riêng tư. Bây giờ tôi nghĩ nó xấu xí.

Sau đó, tôi đã đổi thành this.notationdành cho thành viên riêng tư, nhưng nhận thấy tôi không nhất quán trong việc sử dụng nó, vì vậy tôi cũng đã bỏ nó.


29
Tôi vẫn đang sử dụng _notation và nghĩ rằng nó thật tuyệt.
Arnis Lapsa

3
Tôi ghét _notation; Tôi sử dụng ThisNotation cho các thành viên công khai và thisNotation cho các thành viên riêng tư.
Callum Rogers vào

Tôi cũng ghét nó. Nó làm tôi bối rối :(
Broken_Window

4
Tôi không đồng ý. Nó làm cho việc quản lý tên dễ dàng hơn rất nhiều. Sử dụng PascalCase cho các thuộc tính hoặc các thành viên công khai / nội bộ, _UnderscorePascalCase cho các thành viên được hiển thị thông qua một thuộc tính và camelCase cho các tên tham số trong các phương thức / hàm tạo và các thành viên riêng. Từ khóa 'this' chỉ cần thiết nếu bạn cần chuyển tham chiếu của lớp hiện tại ra bên ngoài lớp hoặc bạn cần truy cập vào một thành viên được tạo tự động trong lớp (chẳng hạn như tên, điều khiển, v.v.).
Evan Plaice

@Evan: Tôi làm chính xác những gì bạn đang mô tả ngoại trừ phần cuối cùng. Tôi có xu hướng sử dụng thishoặc Me(C # & VB.NET tương ứng) khi gọi các phương thức và thuộc tính. IMO, nó làm cho mã của tôi dễ đọc và dễ hiểu hơn sau này, đặc biệt là khi có bốn hoặc nhiều đối tượng trong phạm vi cụ thể đó.
Alex Essilfie

11

Tôi đã ngừng sử dụng phương pháp thiết kế được đề xuất trước khi thực hiện. Làm việc trong một hệ thống hỗn loạn và phức tạp đã buộc tôi phải thay đổi thái độ.

Tất nhiên tôi vẫn làm nghiên cứu mã, đặc biệt là khi tôi chuẩn bị chạm vào mã mà tôi chưa từng chạm vào trước đây, nhưng thông thường tôi cố gắng tập trung vào các triển khai nhỏ nhất có thể để có được thứ gì đó trước. Đây là mục tiêu chính. Sau đó, dần dần tinh chỉnh logic và để thiết kế tự xuất hiện. Lập trình là một quá trình lặp đi lặp lại và hoạt động rất hiệu quả với cách tiếp cận nhanh nhẹn và có nhiều cấu trúc lại.

Mã sẽ không giống với tất cả những gì bạn nghĩ lần đầu tiên nó trông như thế nào. Xảy ra mọi lúc :)


10

Tôi đã từng rất quan tâm đến việc thiết kế từng hợp đồng. Điều này có nghĩa là phải kiểm tra rất nhiều lỗi ở đầu tất cả các chức năng của tôi. Hợp đồng vẫn quan trọng, từ khía cạnh tách biệt các mối quan tâm, nhưng thay vì cố gắng thực thi những gì mã của tôi không nên làm, tôi cố gắng sử dụng các bài kiểm tra đơn vị để xác minh những gì nó làm.


Tôi đã được dạy để lập trình như thế này. Tất nhiên, tôi đang được dạy bởi một giáo viên toán HS, vì vậy tôi cho rằng có lý khi ông ấy muốn các hàm số của mình tự kiểm chứng.
Alex

10

Tôi sẽ sử dụng static trong rất nhiều phương thức / lớp vì nó ngắn gọn hơn. Khi tôi bắt đầu viết các bài kiểm tra, cách luyện tập đã thay đổi rất nhanh.


10

Đã kiểm tra ngoại lệ

Một ý tưởng tuyệt vời trên giấy - xác định hợp đồng rõ ràng, không có chỗ cho sai lầm hoặc quên kiểm tra một số điều kiện ngoại lệ. Tôi đã bị bán khi lần đầu tiên tôi nghe về nó.

Tất nhiên, nó trở thành một mớ hỗn độn trong thực tế. Đến mức có các thư viện ngày nay như Spring JDBC, ẩn các ngoại lệ đã kiểm tra kế thừa như một trong những tính năng chính của nó.


9

Mọi thứ đáng giá chỉ được mã hóa bằng một ngôn ngữ cụ thể. Trong trường hợp của tôi, tôi tin rằng C là ngôn ngữ tốt nhất từ ​​trước đến nay và tôi không bao giờ có lý do gì để viết mã bất kỳ thứ gì bằng bất kỳ ngôn ngữ nào khác ... từ trước đến nay.

Kể từ đó, tôi đánh giá cao nhiều ngôn ngữ khác nhau và những lợi ích / chức năng mà chúng cung cấp. Nếu tôi muốn viết một cái gì đó nhỏ - nhanh chóng - tôi sẽ sử dụng Python. Nếu tôi muốn làm việc trong một dự án lớn, tôi sẽ viết mã bằng C ++ hoặc C #. Nếu tôi muốn phát triển một khối u não, tôi sẽ viết mã ở Perl .


8

Khi cần tái cấu trúc lại, tôi nghĩ sẽ nhanh hơn và gọn gàng hơn nếu bắt đầu ngay lập tức và triển khai thiết kế mới, sửa các kết nối cho đến khi chúng hoạt động. Sau đó, tôi nhận ra rằng tốt hơn nên thực hiện một loạt các tái cấu trúc nhỏ để tiến triển từ từ nhưng đáng tin cậy đối với thiết kế mới.


thể nhớ số lần này có chút tôi ....
Preet Tăng

8

Có lẽ điều lớn nhất đã thay đổi trong cách viết mã của tôi, cũng như những người khác, là việc chấp nhận các lớp và thư viện bên ngoài được tải xuống từ internet làm cơ sở cho các hành vi và chức năng trong các ứng dụng. Ở trường vào thời điểm tôi học đại học, chúng tôi được khuyến khích tìm ra cách làm cho mọi thứ tốt hơn thông qua mã riêng của chúng tôi và dựa vào ngôn ngữ để giải quyết vấn đề của chúng tôi. Với những tiến bộ trong tất cả các khía cạnh của giao diện người dùng và dịch vụ / tiêu thụ dữ liệu, đây không còn là một khái niệm thực tế nữa.

Có một số thứ nhất định sẽ không bao giờ thay đổi trong một ngôn ngữ, và có một thư viện bao bọc mã này trong một giao dịch đơn giản hơn và với ít dòng mã hơn mà tôi phải viết là một điều may mắn. Kết nối với cơ sở dữ liệu sẽ luôn giống nhau. Việc chọn một phần tử trong DOM sẽ không thay đổi. Việc gửi email qua tập lệnh phía máy chủ sẽ không bao giờ thay đổi. Việc phải viết hết lần này đến lần khác làm lãng phí thời gian mà tôi có thể sử dụng để cải thiện logic cốt lõi của mình trong ứng dụng.


7

Khởi tạo tất cả các thành viên trong lớp.

Tôi đã từng khởi tạo rõ ràng mọi thành viên trong lớp bằng một thứ gì đó, thường là NULL. Tôi đã nhận ra rằng điều này:

  • thông thường có nghĩa là mọi biến được khởi tạo hai lần trước khi được đọc
  • là ngớ ngẩn vì trong hầu hết các ngôn ngữ tự động khởi tạo các biến thành NULL.
  • thực sự thực thi một cú đánh hiệu suất nhỏ ở hầu hết các ngôn ngữ
  • có thể mở rộng mã trên các dự án lớn hơn

4
Đôi khi, hậu quả của việc KHÔNG khởi tạo tất cả các thành viên trong lớp có thể thực sự khiến bạn khó chịu.
muusbolla

Trừ khi bạn đang sử dụng ngôn ngữ dựa trên nguyên mẫu tạo ra các phiên bản mới bằng cách sao chép. Khởi tạo tất cả các thành viên thực sự có thể giúp bạn tiết kiệm rất nhiều rắc rối.
Wojciech Bederski

6

Giống như bạn, tôi cũng chấp nhận các mô hình IoC trong việc giảm sự ghép nối giữa các thành phần khác nhau trong ứng dụng của tôi. Nó làm cho việc bảo trì và hoán đổi các bộ phận trở nên đơn giản hơn nhiều, miễn là tôi có thể giữ cho từng bộ phận độc lập nhất có thể. Tôi cũng đang sử dụng nhiều khuôn khổ quan hệ đối tượng hơn như NHibernate để đơn giản hóa công việc quản lý cơ sở dữ liệu.

Tóm lại, tôi đang sử dụng các khuôn khổ "mini" để hỗ trợ xây dựng phần mềm nhanh chóng và hiệu quả hơn. Các khung công tác nhỏ này tiết kiệm rất nhiều thời gian và nếu được thực hiện đúng cách có thể làm cho một ứng dụng trở nên cực kỳ đơn giản để duy trì hoạt động. Cắm 'n Chơi để giành chiến thắng!


-1 Tôi không thể chịu được sự gia tăng của IoC và các khuôn khổ. Tách tốt, IoC và khung = phức tạp không cần thiết
Paul Hollingsworth

Làm thế nào bạn có thể khen ngợi sự tách rời nhưng vẫn ghét trên IoC và các khuôn khổ khác? Đó là những gì mà nhiều khuôn khổ IoC và các mẫu thiết kế làm để bắt đầu.
ajawad987
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.