Các mô hình chống tồi tệ nhất bạn đã gặp [đóng]


9

Các mô hình chống tồi tệ nhất bạn đã gặp trong sự nghiệp là một lập trình viên là gì?

Tôi chủ yếu tham gia vào java, mặc dù nó có thể độc lập với ngôn ngữ.

Tôi nghĩ điều tồi tệ nhất của nó là cái mà tôi gọi là mô hình chống chính . Nó có nghĩa là chương trình bao gồm một lớp duy nhất, cực kỳ lớn (đôi khi đi kèm với một cặp các lớp nhỏ) chứa tất cả logic. Thông thường với một vòng lặp lớn chứa tất cả logic kinh doanh, đôi khi có hàng chục ngàn dòng mã.

Câu trả lời:


38

Nhận xét ra mã. Khối của nó, có thể hàng trăm dòng. Theo lý thuyết, nó được bình luận, nó không gây hại gì và có thể chúng ta sẽ cần nó trong tương lai.


7
Ít nhất bạn có thể xóa nó một cách an toàn. Không giống như ai đó tôi đã làm việc với nó sẽ thường xuyên đổi tên các thủ tục và để mã chết có thể truy cập được. Blech.
Jay

@Cyrena, bạn cũng làm việc với Eric à?!?
CaffGeek

Tôi đã có một loạt mã khi sử dụng #ifdef COMMENT để khóa mọi thứ. Làm việc tuyệt vời cho đến khi ai đó xác định COMMENT.
Michael Kohne

9
Đây là một trường hợp khác khi sử dụng kiểm soát phiên bản trả hết. Bạn có thể xóa mã mà không cần phải hỏi liệu bạn có thể cần nó trong tương lai hay không bởi vì nó có thể được lấy lại với một vài lần nhấn phím.
Jason B

5
Tôi nghĩ rằng mã nhận xét có một vị trí, nếu bạn đặt tiền tố với một nhận xét giải thích lý do tại sao nó ở đó. Đôi khi tôi sẽ để lại một khối nhận xét đại diện cho một con đường tiềm năng mà tôi đã nghĩ về việc đi và để lại nó với một nhận xét về lý do tại sao tôi không làm. @Jason, tôi chắc chắn nghe bạn nói rằng đây là vai trò của kiểm soát phiên bản, nhưng mã bị xóa trong kiểm soát phiên bản không được khám phá nhiều.
nlawalker

19

Tôi sẽ nhấn một cái rõ ràng khác với "copy-pasta". Sao chép mã gần giống với những gì bạn muốn, sau đó thay đổi một số thứ (thay vì trích xuất thành một phương thức).

Điều này đặc biệt phổ biến trong một số mã kiểm tra chức năng và API từ cuối những năm 90: Nghĩa đen là hàng trăm (hoặc thậm chí hàng ngàn) trường hợp kiểm thử gần giống nhau có thể được chia thành một vài chức năng có 3 hoặc 4 tham số - hoặc thậm chí tốt hơn , một cái gì đó dựa trên dữ liệu. Công việc đầu tiên của tôi khi ra trường là đúng 8 tháng viết lại và tái cấu trúc hàng ngàn dòng mì ống đang sử dụng các phương pháp không dùng nữa. Vào thời điểm tôi hoàn thành, các tệp kiểm tra nhỏ hơn một phần 10 kích thước ban đầu của chúng và dễ bảo trì hơn nhiều (và có thể đọc được!).


16

Tôi nghĩ rằng tôi có thể viết rất nhiều về Mô hình Mania và các giải pháp có thể được giải quyết với ít nỗ lực hơn, nhưng tôi muốn chỉ ra một bài viết tuyệt vời mà tôi đã đọc gần đây với một ví dụ tuyệt vời về cách một giải pháp đơn giản có thể được áp dụng quá mức .

Làm thế nào (không) để viết Factorial bằng Java hoặc do đó chúng tôi đưa một nhà máy vào thuật toán của bạn


3
Tuyệt vời! Bây giờ FactorialWebService ở đâu? : P
Thất vọngWithFormsDesigner

1
Tôi gọi nó là Sốt Hoa văn ... mọi người đều có được nó tại một thời điểm trong sự nghiệp của họ. Tốt hơn trong số chúng ta phát triển hơn nó. Tôi đã có một cuộc phỏng vấn nơi anh chàng hỏi tôi khi nào tôi nên nghĩ về các mẫu. Tôi nói với anh ta rằng tôi để họ phát triển thành hệ thống. Ông nói "Không, bạn nên sử dụng các mẫu từ đầu."
Michael Brown

FactoryFactories chỉ là một triệu chứng muốn trì hoãn sự lựa chọn thực tế càng nhiều càng tốt nhưng nó vẫn kết thúc bằng cách mã hóa nó hoặc ánh xạ một giá trị chuỗi bên ngoài vào một đoạn mã. Phụ thuộc tiêm là một giải pháp tốt hơn.

Các mẫu là tạo tác của thiết kế tốt - chúng nên được xử lý như vậy. Tôi thích mô tả chúng như các định nghĩa hơn là các giải pháp. Chúng rất hữu ích khi giao tiếp, nhưng không nhất thiết phải trong thiết kế.
Michael K

Thanx cho điều đó, đọc tốt.
Syg


14

Vùng

Trong C #, bạn có thể xác định vùng mã có thể được thu gọn trong IDE, do đó ẩn nó trừ khi bạn muốn xử lý mã đó. Tôi đã tham gia (hiện đang thực hiện) một dự án trong đó các vùng kéo dài hàng trăm dòng (ước gì tôi đang phóng đại) và có nhiều vùng trong một hàm hàng nghìn (một lần nữa tôi ước mình đang đùa).

Về mặt tích cực, nhà phát triển đã tạo ra khu vực đã làm rất tốt trong việc xác định các chức năng cụ thể trong một khu vực. Đến nỗi tôi đã có thể thực hiện một phương pháp trích xuất trong khu vực và tiếp tục.

Các khu vực khuyến khích các nhà phát triển "che giấu" tào lao của họ trong tầm nhìn rõ ràng.


15
+1 cho Khu vực khuyến khích các nhà phát triển "che giấu" tào lao của họ trong tầm nhìn rõ ràng. Tuy nhiên, khi được sử dụng đúng cách, tôi thấy rằng các vùng giúp nhóm hợp lý mã với nhau và dễ dàng tìm thấy sau đó.
Darren Young

Điều này từ lâu đã là một vấn đề với các biên tập viên gấp. Tôi đã từng làm điều tương tự khi tôi lập trình lần cuối ở OCCAM.
Michael Kohne

2
Tôi yêu các khu vực ... nhưng chỉ dành cho tổ chức ... không che giấu các đoạn mã kỹ thuật số.
I Ab.

3
+1. Đó cũng là lý do tại sao việc sử dụng các vùng vi phạm quy tắc StyleCop SA1124 DoNotUseRegions.
Arseni Mourzenko

1
Tôi có các dự án hoạt động với số lượng lớn các trường trong SQL và mã cập nhật / tạo ra nó là nhiều dòng. Một khu vực #region SQL Updatelàm cho nó có thể thu gọn để cần ít cuộn hơn.
JYelton


9

Phương pháp không quá tải:

// Do something
public int doSomething(Data d);

// Do same thing, but with some other data
public int doSomething2(SomeOtherData d);

Rõ ràng cho thấy rằng các lập trình viên không hiểu quá tải.


5

Trình tự chuyển mạch vòng

http://en.wikipedia.org/wiki/Loop-switch_ resultence

Họ làm phiền tôi đến tận cùng và thực sự cho thấy các nhà phát triển thiếu kinh nghiệm như thế nào


À, một máy trạng thái chấm dứt :)

Tại sao bạn phải nuôi những ký ức bị chôn vùi này? Tôi đã có một ngày tốt đẹp như vậy.
Malachi

5

Mã hóa mềm , tức là khi các lập trình viên ra khỏi con đường của họ để tránh mã hóa cứng và kết thúc ở phía bên kia của thang đo - phụ thuộc "mã hóa cứng".


4

Giữ trạng thái trong khách hàng.

Sau khi làm việc với một ứng dụng web trong đó tất cả trạng thái được giữ trong trình duyệt. (Để đảm bảo khả năng mở rộng không gặp sự cố, tất cả các ngoại lệ đã bị bỏ qua).


Bạn có thể vui lòng giải thích? Imho, đối với một ứng dụng Web, sẽ ổn khi trạng thái duy nhất nằm trong Trình duyệt (tức là cookie) và máy chủ là 'không chia sẻ gì'. Hay bạn có nghĩa là 'trạng thái' như trong 'cơ sở dữ liệu ứng dụng'?
keppla

Trạng thái: Như trong dữ liệu thực tế để hoạt động.

OO bạn có sự đồng cảm sâu sắc nhất của tôi.
keppla

4

Checkins lớn

Tôi ghét khi tôi thấy một nhà phát triển đã không thực hiện đăng ký trong hơn một tuần. Điều đó có nghĩa là anh ta hoặc bị mắc kẹt và không tìm kiếm sự giúp đỡ, hoặc anh ta kết hợp một loạt các tính năng vào một lần đăng ký lớn. (Tôi đã bỏ qua tình huống xấu nhất, anh ta không làm gì cả. Thật dễ để giải quyết ... hai từ nghe có vẻ như bạn được thuê.)

Nếu bạn đang thực hiện một đăng ký lớn, bạn sẽ mất rất nhiều lợi ích của SCM, như có thể liên kết một thay đổi với một tính năng cụ thể. Ngoài ra, bạn có thể có rất nhiều việc phải làm và điều đó không nhất thiết phải dễ dàng để làm đúng.


1
Không làm bất cứ điều gì không phải luôn luôn là trường hợp xấu nhất. Đôi khi, tốt hơn là bạn phải viết nó từ đầu hơn là viết lại mã ...
Malachi

4

Hiện tại, tôi đang làm việc với một đoạn mã kế thừa và tôi thích cách mà lập trình viên trước đó có được yếu tố đầu tiên của danh sách:

String result;
for(int i = 0; i < someList.size(); i++) {
    result = someList.get(i);
    break;
}

Nhưng điều tồi tệ nhất tôi từng thấy trong mã này là xác định các lớp trang JSP nội tuyến, viết tất cả HTML, CSS và Javascript bằng scriptlet và out.println :-(


4

Một trong những kiểu chống hành vi tồi tệ nhất mà tôi đã thấy là một cửa hàng chỉ cho phép mã được kiểm tra để kiểm soát phiên bản sau khi nó được sản xuất. Kết hợp với kiểm tra độc quyền trong VSS, điều này dẫn đến một quá trình hoàn tác khó kiểm tra nếu một lỗi sản xuất cần được sửa chữa trước khi phát hành tiếp theo, chứ đừng nói đến việc nhiều người cần thay đổi một tệp nhất định cho bản phát hành sắp tới.

Thực tế rằng đây là một chính sách bộ phận làm cho nó thậm chí còn tồi tệ hơn trường hợp của một nhà phát triển duy nhất hành xử theo cách này.


3

Khóa trên một chuỗi chữ

synchronized("one") { /* block one A*/ }

synchronized("one") { /* block one B*/ }

Tên lớp rất dài. (trong JRE)

com.sun.java.swing.plaf.nimbus.
InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedState

Cơ cấu thừa kế kém

com.sun.corba.se.internal.Interceptors.PIORB extends
com.sun.corba.se.internal.POA.POAORB extends
com.sun.corba.se.internal.iiop.ORB extends
com.sun.corba.se.impl.orb.ORBImpl extends
com.sun.corba.se.spi.orb.ORB extends
com.sun.corba.se.org.omg.CORBA.ORB extends 
org.omg.CORBA_2_3.ORB extends
org.omg.CORBA.ORB

Một ngoại lệ không phải là.

public interface FlavorException { }

Xử lý lỗi vô nghĩa và khó hiểu

if (properties.size() > 10000)
   System.exit(0);

Tạo vật thể không cần thiết

Class clazz = new Integer(0).getClass();
int num = new Integer(text).intValue();

Ném một ngoại lệ cho các mục đích khác

try {
    Integer i = null;
    Integer j = i.intValue();
} catch (NullPointerException e) {
    System.out.println("Entering "+e.getStackTrace()[0]);
}

Sử dụng các đối tượng thể hiện cho các phương thức tĩnh.

Thread.currentThread().sleep(100);

Đồng bộ hóa trên một trường không phải là cuối cùng

synchronized(list) {
   list = new ArrayList();
}

Bản sao vô nghĩa của một chuỗi không đổi

String s = new String("Hello world");

Cuộc gọi vô nghĩa đến String.toString ()

String s = "Hello";
String t = s.toString() + " World";

Gọi tới System.gc () để giải phóng bộ nhớ

Đặt biến cục bộ thành null để giải phóng bộ nhớ

    // list is out of scope anyway.
    list = null;
}

Sử dụng ++ i thay vì i ++ vì lý do hiệu suất (hoặc bất kỳ tối ưu hóa vi mô nào khác)


Chúng không nhất thiết phải chống mẫu, chỉ là mã hóa xấu.
Gary Willoughby

@Gary, hoặc mô hình phát triển kém tôi thấy lặp đi lặp lại. Có lẽ không nằm trong định nghĩa nghiêm ngặt của một mô hình chống.
Peter Lawrey

1
@Peter: "Gọi System.gc () để giải phóng bộ nhớ", tôi đã thấy một dịp mà .NET sẽ phát nổ với ngoại lệ OutOfMemory trừ khi được gọi một cách rõ ràng. Tất nhiên đó là một ngoại lệ hơn là một quy tắc.
Coder

3

Mã rắc:

// TODO: 

hoặc là

// TODO: implement feature 

không có thêm thông tin.


2

Lặp đi lặp lại cho người giả:

Iterator iCollection = collection.iterator();
for(int i = 0 ; i < collection.size() ; i++ ){
    if(collection.get(i) == something){
       iCollection.remove();
    }
 }

Xưởng sản xuất Singletono:

public class SomeObject{
   private SomeObject() {}
   public static SomeObject getInstance(){
       return new SomeObject();
   }
}

if-other thúc đẩy phát triển (còn được gọi là nguyên tắc đóng mở - mở để sửa đổi gần để hiểu):

if (sth1){
...  
}else if(sth2){
..
}
...
..
else if(sth1000000000000){
...
}

StringPotype (còn được gọi là StringObject):

a) sendercode
if(sth1)
   str+="#a";
if(sth2)
   str+="#b";
...
if(sth1000)
   str+="#n";

b) receiver
   regexp testing if str contains #a, #b, ... #n

Đó else ifthường là cách duy nhất để hoàn thành công việc, mặc dù. Tôi đang nghĩ về chuỗi; không thể sử dụng một công tắc. Các điều kiện nên giống nhau cho nó là hữu ích.
Michael K

IMHO mỗi if / other có thể được thay thế bằng ánh xạ đơn giản hoặc mẫu khách truy cập. Trong trường hợp chuỗi, tức là bạn có thể có tệp thuộc tính như: someString1 = some.package.ObjectToHandleSomeString1
Marcin Michalski

2
Các singleton một nhà máy . Không có gì sai với mã đó. Điều duy nhất có thể sai là mã bên ngoài đưa ra giả định, rằng mọi lệnh gọi getInstancetrả về cùng một thể hiện. Giả định như vậy sẽ phá vỡ sự đóng gói và trên thực tế là một trong những kiểu chống phổ biến nhất.
back2dos

exacly đó là lý do tại sao nó rất khó hiểu :) nếu phương thức được gọi là tạo () hoặc nó sẽ trả về cùng một ví dụ mỗi lần mọi thứ sẽ hoàn toàn ổn
Marcin Michalski

2

Nó không quá giống với mẫu mã hóa mà là mẫu hành vi, mặc dù nó khá tệ: sửa đổi một cái gì đó trong mã (giả sử các yêu cầu đã thay đổi), sau đó điều chỉnh tất cả các thử nghiệm đơn vị cho đến khi mã vượt qua. Tinh chỉnh hoặc đơn giản là loại bỏ tất cả mã kiểm tra khỏi phương thức kiểm tra, nhưng để phương thức đó ở đó.

Mặc dù vậy, điều này được liên kết với một mẫu chung hơn, mẫu Điều đó sẽ làm , đây là một dòng mã đại diện cho nó:

int num = new Integer( stringParam ).parseInt( stringParam );

Nó hoạt động, sau khi tất cả.


2

Tôi hoàn toàn coi thường sự đảo ngược trừu tượng , hoặc phát minh lại các nguyên thủy cấp thấp trên các nguyên thủy cấp cao. Đôi khi, mặc dù, điều này được gây ra bởi các nhà thiết kế ngôn ngữ xấu, không phải lập trình viên xấu. Ví dụ:

  1. Sử dụng một lớp phương thức duy nhất không có biến thành viên và giao diện tương ứng, (được thực hiện theo các bảng của con trỏ hàm), thay vì một con trỏ hàm. Lưu ý rằng trong các ngôn ngữ như Java, bạn có thể không có lựa chọn nào khác.

  2. Trong MATLAB và R, nhấn mạnh rằng mọi thứ là một vectơ / ma trận chứ không phải là nguyên thủy.

  3. Trong khi chúng ta đánh bại MATLAB, thì thực tế là nó không có số nguyên, vì vậy khi bạn cần một số nguyên, bạn phải sử dụng một số kép.

  4. Các ngôn ngữ chức năng thuần túy nơi bạn phải sử dụng các lệnh gọi hàm để viết một vòng lặp.


1

Nó chắc chắn sẽ được sao chép / dán, tôi đã thấy rất nhiều mã xấu được thực hiện vì nó, mã hóa cao bồi và mọi thứ bắt nguồn từ đó. (Các lớp học thần, phương pháp cực lớn, thuật toán suy nghĩ xấu, v.v.)

Và nếu các mẫu thiết kế được cho phép, chúng sẽ nói: Thực hiện một dự án như một tập hợp các hành động từ một kế hoạch, mà không thực hiện bất kỳ phân tích thiết kế hoặc miền nào.


1

Đậu java đa dụng -

Một java bean có rất nhiều biến, được sử dụng trong một vài loại hoạt động khác nhau. Mỗi hoạt động sử dụng một số tập hợp con tùy ý của các biến bean và bỏ qua các biến khác. Một vài biến cho trạng thái gui, một vài biến được đưa vào để chuyển xung quanh giữa các thành phần, một số biến có thể thậm chí không được sử dụng nữa. Các ví dụ tốt nhất không có tài liệu, điều này sẽ cản trở sự đánh giá của mẫu.

Ngoài ra, không thể quên người yêu dấu

try{ 
   ... //many lines of likely dangerous operations
}
catch(Exception e){}

IMHO, ngoại lệ bốc mùi. Họ quá khó để làm cho họ đúng, và họ thêm một cảm giác an toàn sai lầm.
Coder

Cho dù ý kiến ​​của bạn về sự hôi thối của ngoại lệ, âm thầm nuốt một người phải bốc mùi nhiều hơn.
Steve B.

1

Một đồng nghiệp cũ có thói quen sử dụng lại các đối tượng bằng cách ghi đè các thuộc tính của họ, thay vì chỉ đơn giản là tạo các đối tượng mới. Tôi không bao giờ có thể tưởng tượng được số lượng vấn đề này đã gây ra khi thực hiện các tính năng mới.


1

Một cái gì đó đã gây cho tôi rất nhiều đau buồn là mô hình "Bản đồ lớn trên bầu trời". Ném xung quanh một bản đồ thay vì sử dụng các đối tượng thích hợp. Bạn không biết nó chứa "biến" nào mà không cần gỡ lỗi và bạn không biết nó có thể chứa gì mà không theo dõi mã ngược. Thông thường ánh xạ Chuỗi thành Đối tượng hoặc Chuỗi thành Chuỗi, mà bạn có khả năng phải phân tích cú pháp thành nguyên thủy.


Âm thanh giống như dựa vào Phiên và ViewState trong ASP.NET để truyền dữ liệu giữa các trang, điều đáng buồn là thường được yêu cầu ...
Wayne Molina

1

Một trong những kiểu chống phát triển yêu thích của tôi là việc sử dụng "thiết kế" cơ sở dữ liệu yêu cầu liên tục thêm các cột bổ sung vào một hoặc nhiều bảng theo chương trình . Đây là anh em họ của "thiết kế" tạo ra một bảng mới cho mỗi phiên bản của một thực thể. Cả hai chắc chắn gặp phải những hạn chế của máy chủ cơ sở dữ liệu, nhưng thường là cho đến khi hệ thống được sản xuất khá lâu.


0

Tôi nghĩ rằng một trong những kiểu chống tồi tệ nhất tôi từng thấy liên quan đến việc sử dụng bảng Cơ sở dữ liệu làm bộ nhớ tạm thời thay vì sử dụng bộ nhớ máy tính.

Miền vấn đề là độc quyền khiến tôi không thể giải thích nó, nhưng không cần thiết phải hiểu vấn đề cơ bản. Đây là một ứng dụng GUI được viết bằng Java với Cơ sở dữ liệu phụ trợ. Đó là lấy một số dữ liệu đầu vào, thao tác và sau đó cam kết dữ liệu đã xử lý vào cơ sở dữ liệu.

Dự án của chúng tôi có một thuật toán khá phức tạp giúp lưu các giá trị trung gian để xử lý sau này. Thay vì đóng gói các đối tượng tạm thời trong ... các đối tượng, một bảng cơ sở dữ liệu đã được tạo như vậy "t_object". Mỗi khi một giá trị được tính toán, nó được thêm vào bảng này. Sau khi thuật toán hoàn thành, nó sẽ chọn tất cả các giá trị trung gian và xử lý tất cả chúng trong một đối tượng Bản đồ lớn. Sau khi tất cả quá trình xử lý đã kết thúc, các giá trị còn lại được đánh dấu sẽ lưu sẽ được thêm vào lược đồ cơ sở dữ liệu thực và các mục tạm thời trong bảng "t_object" sẽ bị loại bỏ.

Bảng cũng được sử dụng như một danh sách duy nhất, dữ liệu chỉ có thể tồn tại một lần. Đây có thể là một tính năng tốt của thiết kế nếu chúng tôi đã triển khai các ràng buộc trên bảng, nhưng cuối cùng chúng tôi đã lặp lại qua toàn bộ bảng để xem liệu dữ liệu có tồn tại hay không. (Không, chúng tôi thậm chí không sử dụng các truy vấn được sử dụng trong các mệnh đề có CONTAIN)

Một số vấn đề chúng tôi gặp phải do thiết kế này đã được gỡ lỗi cụ thể. Ứng dụng được xây dựng để truyền dữ liệu, do đó sẽ có nhiều GUI xử lý trước dữ liệu trước khi đến thuật toán này. Quá trình gỡ lỗi là xử lý một trường hợp thử nghiệm và sau đó tạm dừng ngay sau khi hoàn thành phần trên. Sau đó, chúng tôi sẽ truy vấn cơ sở dữ liệu để xem dữ liệu nào được chứa trong bảng này.

Một vấn đề khác mà chúng tôi phát hiện ra là dữ liệu không được xóa đúng cách khỏi bảng tạm thời này, điều này sẽ gây trở ngại cho việc chạy trong tương lai. Chúng tôi phát hiện ra điều này là do Ngoại lệ không được xử lý đúng cách và do đó ứng dụng không thoát đúng cách và không xóa dữ liệu trong bảng mà nó kiểm soát.

Nếu chúng ta đã sử dụng Thiết kế hướng đối tượng cơ bản và giữ mọi thứ trong Bộ nhớ, những vấn đề trên sẽ không bao giờ xảy ra. Đầu tiên, việc gỡ lỗi sẽ đơn giản vì chúng ta có thể dễ dàng thiết lập các điểm ngắt trong ứng dụng và sau đó kiểm tra bộ nhớ trong ngăn xếp và đống. Thứ hai, khi thoát khỏi ứng dụng bất thường, bộ nhớ java sẽ được dọn sạch một cách tự nhiên mà không phải lo lắng về việc xóa nó khỏi cơ sở dữ liệu.

LƯU Ý: Tôi không nói rằng mô hình này vốn đã xấu, nhưng trong ví dụ này tôi thấy nó không cần thiết khi các nguyên tắc OO cơ bản sẽ có hiệu lực.

Tôi không chắc chắn về tên cho mẫu chống này vì đây là lần đầu tiên tôi thấy bất cứ điều gì như thế này được thực hiện. Bất kỳ tên tốt mà các bạn có thể nghĩ cho mô hình này?


Tôi sẽ không gọi đây là một vấn đề chăn. Nó phụ thuộc vào lượng dữ liệu tạm thời đang được lưu trữ và những gì được thực hiện với nó.
GrandmasterB

Tôi nên thêm nhiều hơn vào bài viết nhưng vấn đề chính là thay vì sửa đổi các đối tượng và truy cập dữ liệu từ bộ nhớ, dữ liệu đã bị thao túng bằng mã hack sql. Điều này dẫn đến sự gia tăng phức tạp và các vấn đề hiệu suất nghiêm trọng.
jluzwick

2
Bạn không đề cập đến miền vấn đề của mình, nhưng không phải lúc nào cũng là điều xấu, việc giữ trạng thái ở nơi khác như thế này có thể cho phép các quy trình mở rộng và được hướng nội trong thời gian dài, cũng để giúp gỡ lỗi. Là truy cập DB gây ra vấn đề hiệu suất hoặc mối quan tâm?
Jé Queue

Tôi đã chỉnh sửa bài viết để phản ánh tốt hơn cách sử dụng nó trong dự án của chúng tôi, nhưng chúng tôi gặp nhiều vấn đề khi gỡ lỗi, đặc biệt vì chúng tôi phải truy vấn cơ sở dữ liệu để xem các biến tạm thời. Ngoài ra, chúng tôi có các vấn đề lớn liên quan đến hiệu suất do cơ sở dữ liệu liên tục bị truy vấn dữ liệu và kiểm tra xem dữ liệu mới đã tồn tại chưa.
jluzwick

0

Giỏ hàng trước khi ngựa - còn gọi là YouMightNeedIt

Ví dụ:

  • Tạo một lược đồ RDMB với các khái niệm trừu tượng, các tham chiếu chéo - về bản chất là một khối dữ liệu được khái quát hóa quá mức ... Và THEN viết các tính năng xung quanh một mô hình mọi thứ.

Đó sẽ là người anh em sinh đôi xấu xa của YAGNI, phải không?
Wayne Molina

0

IMO mẫu chống mẫu tồi tệ nhất tôi từng thấy là "Chúng tôi không cần bất kỳ mẫu nào của stinkin": Ý tưởng cho rằng các mẫu thiết kế rất lãng phí thời gian và bạn có thể viết mã nhanh hơn bằng cách ghép chúng lại và sao chép / dán khi cần thiết.

Đề cập đáng trân trọng là có mã tải một đối tượng từ cơ sở dữ liệu bằng cách sử dụng kiểu VB6 cũ của:

Foobar oFoo = new Foobar();
oFoo.FooID = 42;
if (oFoo.Load()) { 
    // do something with oFoo
}

không thực sự là một mô hình chống đối, nhưng cho thấy sự thiếu tận dụng kiến ​​trúc phù hợp và tách biệt các mối quan tâm.

Ngoài ra, những thứ như thế này:

// this name is misleading, we may not always want to stand in fire,
// we may want to stand in slime or voidzones or ice patches...
public Foobar StandInFire() { }

// why is this here???
public string BeatWithNerfBat(string whom) { }

// ????
public int GivePony(string to) { }
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.