2009-10-13 5 views
7

Tôi đã xem xét sự khác biệt giữa Lucene 2.9 đặc biệt là API mã thông báo redone và nó chỉ xảy ra với tôi đặc biệt xấu xí của nó so với cũ chỉ trả về một giá trị mới hoặc repopulate với giá trị nếu bạn sử dụng lại Token.API nào xấu nhất cho một thư viện tương đối nổi tiếng mà bạn đã thấy, và tại sao và làm thế nào nó có thể được cải thiện?

Tôi chưa thực hiện bất kỳ hồ sơ nào nhưng có vẻ như sử dụng MAP để lưu trữ thuộc tính không hiệu quả và sẽ dễ dàng hơn khi tạo giá trị giữ giá trị kiểu mới v.v. khá nhiều không bao giờ cần thiết những ngày này cho các loại giá trị đơn giản như một Token của văn bản.

+0

Win32 : API xấu nhất từng được viết (Tôi sẽ giải thích sau) –

Trả lời

8

creat()

Khi Ken Thompson và Dennis Ritchie nhận được giải thưởng 1983 Turing, sau bài phát biểu chấp nhận của mình, một người nào đó trong khán giả hỏi Ken những gì ông sẽ làm khác đi với Unix nếu anh ta đã làm lại tất cả. Anh ta nói, "Tôi sẽ đánh vần 'tạo' với 'e'."

+2

Tôi muốn nói "LOL", nhưng điều đó không có 15 ký tự. –

+0

Tôi không chắc chắn về xấu xí, nhưng tôi sẽ cung cấp cho một upvote cho báo giá hài hước. –

+1

nó đã được sửa: http://code.google.com/p/go/source/detail?r=4a3f6bbb5f0c6021279ccb3c23558b3c480d995f – Vlagged

0

tốt, đó là một thư viện nổi tiếng khoảng 20 năm trước, nhưng tôi nghĩ rằng công cụ dữ liệu btrieve ban đầu có api tồi tệ nhất từng được viết. hầu như mọi thứ đều trải qua một cuộc gọi, với mỗi tham số của nó chứa một giá trị khác nhau tùy thuộc vào cuộc gọi bạn đang thực hiện (một tham số là cờ cho hệ thống nếu bạn muốn mở tệp, đóng tệp, tìm kiếm, chèn, v.v.) tôi thích btrieve cách trở lại sau đó, nhưng tôi đã dành một thời gian dài làm cho một lớp trừu tượng tốt.

có thể dễ dàng cải thiện bằng cách không ép mọi thứ vào một cuộc gọi. không chỉ là một cuộc gọi ghê gớm, mà lập trình viên chịu trách nhiệm phân bổ, đi vào và giải phóng khối vị trí ... một số bộ nhớ được sử dụng bởi btrieve để theo dõi xử lý tệp mở, vị trí, v.v. một cải tiến khác sẽ cho phép ascii văn bản được sử dụng khi xác định chỉ mục. các chỉ số phải được xác định bằng một biểu diễn nhị phân phức tạp.

Trân trọng, don

+0

Âm thanh tương tự như các cuộc gọi dos int cũ, trong đó nhiều hàm được truy cập bởi một int thông dụng và chỉ được phân biệt bằng số trong thanh ghi s. –

+0

đó sẽ là những gì nó đã được mô hình sau khi tôi nghĩ. chỉ là thực tế là động cơ quá lười để phân bổ bộ nhớ riêng của nó cho khối điều khiển khiến tôi phát điên. –

1

Hầu hết chắc chắn không phải là xấu nhất. Có lẽ rất nhiều, nhưng Flex có một vị trí đặc biệt trong địa ngục. Cụ thể UIComponent mà so với Sprite, cảm thấy như sử dụng một cưa để bóc một quả táo. Tôi tin rằng Flex sẽ được cải thiện nhiều bằng cách sử dụng các đối tượng nhẹ hơn và các tính năng mixin-phong cách tương tự như cách Dojo hoạt động ở phía Javascript.

Lớp ECMAScript/Actionscript Ngày tất cả nhưng ngược lại và vô ích. Đó là một nỗi đau liên tục bất cứ lúc nào tôi cần làm một cái gì đó phức tạp hơn so với thêm dấu thời gian vào nhật ký. Họ cần nhiều tùy chọn phân tích cú pháp hơn (ví dụ: khả năng xác định định dạng đầu vào) và quản lý thời gian tốt hơn, như tăng thông minh, chức năng tiện lợi, v.v ...

C++ Thư viện STL (và mẫu nói chung), mặc dù hữu ích , đã luôn luôn cảm thấy đồng bằng xấu xí. Không có đề xuất cho cải tiến mặc dù. Họ làm việc.

2

Một số phương pháp nhất định java.io.File, quan trọng đối với lập trình hệ thống, trả về giá trị logic để cho biết thành công hay thất bại. Nếu phương thức như vậy (ví dụ: mkdir hoặc delete) không thành công, bạn có không có cách nào ở tất cả để tìm hiểu lý do.

Điều này luôn làm cho hàm của tôi bị treo.

+0

Yup cực kỳ xấu xí không oo wrapper trên một số mã c. –

5

Tôi chưa bao giờ là một fan hâm mộ của gói java.sql ...

  1. Bạn cần phải nắm bắt những ngoại lệ kiểm tra tất cả mọi thứ, và chỉ có một ngoại lệ, vì vậy nó không thực sự đưa ra bất cứ chỉ ra những gì đã đi sai mà không kiểm tra chuỗi mã SQL.
  2. Thêm vào đó thực tế là bạn phải sử dụng java.sql.Date thay vì java.util.Data, vì vậy bạn luôn phải chỉ định gói đầy đủ cho một hoặc cái kia. Chưa kể đến việc chuyển đổi phải diễn ra giữa hai người.
  3. Và sau đó có chỉ số tham số, được lập chỉ mục 1-base thay vì phần còn lại của Java, là 0-base-indexed.

Tất cả trong tất cả, một thư viện khá khó chịu. Rất may, các thư viện Spring làm cho nó khá dễ dàng hơn một chút để làm việc với.

+0

Tôi ghét SQLException duy nhất. Khoá trùng lặp, cú pháp SQL, chúng quay lại mã của tôi theo cùng một cách. – MBCook

0

Rất nhiều chức năng thư viện CRT kém hoặc mơ hồ được đặt tên có thể do hạn chế mã hóa cũ trong ngày và do đó yêu cầu sử dụng thường xuyên khóa F1 để mọi người tìm đúng chức năng và cung cấp đối số phù hợp.

Tôi đã sử dụng chức năng CRT trong một thời gian và tôi vẫn thấy mình đánh trúng F1 một số tiền hợp lý.

3

COM. Những cải tiến lớn nhất của nó đã trở thành .NET.

+1

Tôi đã không sử dụng COM bản thân mình, mua tôi * nhìn * vào nó. IIDIIInterface nightmare! –

+0

COM là tuyệt vời trong ngày khi visual studio 6 là mới. Sự xấu xí chính của COM đến từ các trình bao bọc khác nhau của nó, như ATL sử dụng các ký hiệu quá mức của hungarian. .NET tuân thủ đầy đủ COM. –

+0

tôi nghĩ COM là quá khủng khiếp vì EITHER 1) microsoft muốn nó phức tạp vì vậy nó gắn bạn vào sử dụng trình biên dịch của họ. phải mất một thời gian dài cho bất kỳ ai ngoài microsoft triển khai COM mà không có trình biên dịch MS HOẶC 2) eggheads tại microsoft có quá nhiều phd và không quan tâm đến việc tạo ra thứ gì đó mà người dùng có thể sử dụng mà không cần trình biên dịch microsoft –

1

Tôi sẽ nói MFC, ATL và WTL. Tất cả 3 thư viện này sử dụng ký hiệu hungarian quá mức, xác định lại các kiểu dữ liệu không có lý do rõ ràng (CString được xác định lại nhiều lần) và được thay đổi rõ rệt với mỗi phiên bản của studio trực quan.

Tôi thích COM. Nó cung cấp một kiến ​​trúc định hướng thành phần từ lâu trước khi .NET được phát triển. Tuy nhiên, việc mở rộng COM thành DCOM, nhiều trình bao bọc của nó như ATL và thiếu tài liệu toàn diện chung của nó làm cho nó trở thành API xấu nhất mà tôi phải giải quyết tại nơi làm việc.

3

Ngày/giờ của Java API khá khủng khiếp khi làm việc. java.util.Date có một số hàm tạo để tạo một cá thể cho một ngày cụ thể, nhưng tất cả chúng không được chấp nhận. java.util.GregorianCalendar nên được sử dụng thay vào đó, nhưng điều đó có một cách rất khó chịu trong việc thiết lập các trường (nghĩ calendar.setField (GregorianCalendar.MONTH, 7) thay vì calendar.setMonth (7) sẽ tốt hơn nhiều). Cảm giác hoàn thiện là hầu hết các lớp và thư viện khác vẫn mong đợi một ngày thay vì một lịch, vì vậy bạn phải liên tục chuyển đổi qua lại.

+0

Mặc dù ngày/giờ xuất hiện trên tất cả các vị trí trong mã, nếu bạn bỏ qua các phương pháp không dùng nữa và tạo các bản sao phòng thủ và bỏ qua kiểu thừa kế kiểu lạ không phải là một nhức đầu lớn. Nếu bạn bỏ qua các bản sao phòng thủ và bắt đầu poking xung quanh bằng cách sử dụng Apis không được chấp nhận của bạn yêu cầu cho sự cố. Nhưng thời gian ngày vv chỉ là một vài loại giá trị mà chúng không có chức năng phong phú như một thư viện lớn như một băng được sử dụng trong myexample. Làm việc xung quanh ngày khó chịu là một vài dòng tại một thời điểm nhưng Lucene thuộc tính trong tokenstreams sẽ được tham gia nhiều hơn một chút. –

3

Không phải là người chiến thắng, nhưng xứng đáng được đề cập một cách đáng kính; Android. Sử dụng ngôn ngữ lập trình Java 5, nhưng hầu như không có bất kỳ tính năng ngôn ngữ Java 5 nào. Thay vì enums bạn nhận được hằng số nguyên với tiền tố hoặc hậu tố.

Nó có thể không hoàn toàn quyết định nếu nó nên được hướng đối tượng, hoặc thủ tục. Hiển thị các hộp thoại là một ví dụ điển hình. Một số cuộc gọi lại với các id nguyên tự định nghĩa để hiển thị cuộc gọi khi hộp thoại, có mùi của một API C cũ. Và sau đó bạn sẽ có được một lớp học xây dựng bên trong lớp với phương pháp xích, có mùi của OOP kiến ​​trúc của loại tồi tệ nhất.

Lớp MotionEvent có toạ độ X và Y là các giá trị tuyệt đối và tương đối từ cùng một phương thức phụ kiện. Nhưng không có cách nào để kiểm tra loại tọa độ mà nó hiện đang nắm giữ.

Android chắc chắn là một túi hỗn hợp.

+1

Android prolly sử dụng ints chứ không phải là enums bởi vì enums là các lớp học và ăn nhiều hơn một chút bộ nhớ. –

+1

Vâng, đó là sự thật, và đó là lập trường chính thức. Nhưng tôi thấy nó ngu ngốc như "Không ai cần nhiều hơn 640K RAM". Khi xây dựng một khuôn khổ "hiện đại", bạn nên lập kế hoạch cho tương lai, không để quá khứ ép bạn vào một thiết kế tồi. Nó không giống như một enum mất nhiều bộ nhớ. – PeyloW

+0

Hơn nữa, không có gì ngăn cản trình biên dịch biến enums thành ints. –

2

Tôi sẽ bật câu hỏi này trên đầu và đặt tên API đẹp cho thư viện có API chuẩn hầu hết là xấu: các liên kết Haskell cho OpenGL.

Đây là những lý do sau:

  • Thay vì lumping tất cả mọi thứ vào một số ít các tiêu đề, thư viện được tổ chức một cách logic thành các module rời rạc, có nội dung song song với cấu trúc của các đặc điểm kỹ thuật OpenGL. Điều này làm cho việc duyệt tài liệu trở thành một trải nghiệm thú vị.

  • Các chức năng "bắt đầu/kết thúc" được thay thế bằng các quy trình bậc cao hơn. Ví dụ, thay vì

    pushMatrix(); 
        doSomeStuff(); 
        doSomeMoreStuff(); 
    popMatrix(); 
    

    bạn muốn nói

    preservingMatrix $ do 
        doSomeStuff 
        doSomeMoreStuff 
    

    Cú pháp của các ràng buộc thực thi các công ước của thư viện, thay vì làm cho bạn làm điều đó bằng tay. Điều này làm việc cho các bản vẽ nguyên thủy của quads, tam giác, dòng, vv là tốt. Tất cả điều này là ngoại lệ an toàn, tất nhiên.

  • Getters và setters được thay thế bằng "StateVars" thành ngữ, giúp đọc và viết hoạt động đối xứng hơn.

  • Nhiều phiên bản của hàm được thay thế bằng đa hình và kiểu dữ liệu bổ sung. Thay vì gọi điện thoại, giả sử, glVertex2f với hai giá trị nổi, bạn gọi vertex với giá trị loại Vertex2 GLFloat.

Tài liệu tham khảo:

+2

OpenGL trong Haskell thực sự là tốt đẹp, nhưng lý do chính mà OpenGL bình thường là xấu xí như vậy là C là xấu xí. Thật khó để thiết kế một API C thực sự tốt đẹp. – Zifre

+1

@Zirfe - Bạn và tôi không đồng ý về những gì xấu. Có thể thiết kế một API C đẹp mắt. Nó chỉ là khá khó khăn. –

7

Livelink (OpenText) API

  • Tất cả mọi thứ trở lại như một số hình thức kỳ lạ của một mảng lởm chởm
  • Các tài liệu cung cấp hoàn toàn không có ví dụ
  • [công cụ tìm kiếm ưa thích của bạn] thường trả về kết quả cho một phương thức API cụ thể
  • Diễn đàn hỗ trợ cảm thấy gần bị bỏ rơi
  • Cách đáng tin cậy duy nhất để hiểu dữ liệu kết quả là chạy dữ liệu trong Livelink debugg er
  • Và cuối cùng ... hệ thống chi phí hàng chục (trăm) ngàn đô la

Bức tường bên cạnh bàn làm việc của tôi có một dấu ấn đầu của tôi ...

Một ví dụ rất đơn giản nhận giá trị ngoài phương thức API:

var workflow = new LAPI_Workflow(CurrentSession); 

// every Livelink method uses an out variable 
LLValue outValue; 
// every method returns an integer that says if the call was 
// a success or not, where 0 = success and any other integer 
// is a failure... oh yeah, there is no reference to what any 
// of the failure values mean, you have to create your own 
// error dictionary. 
int result = workflow.ListWorkTasks(workId, subWorkId, taskId, outValue); 


if (result = 0) 
{ 
    // and now let's traverse through at least 3 different arrays! 
    string taskName = outValue.toValue(0).toValue("TASKS").toValue(0).toString("TaskName"); 
} 

Aaack !!!: D

+0

+1 :-) Đó là lý do tại sao đã được tạo ra một số thư viện LAPI thư viện wrapper hoặc thậm chí thay thế thư viện LAPI ... –

2

Direct3D!

Không nghi ngờ giao diện cũ trước Direct3D 5 là khá darn fugly:

// GL code 
glBegin (GL_TRIANGLES); 
    glVertex (0,0,0); 
    glVertex (1,1,0); 
    glVertex (2,0,0); 
glEnd(); 

// D3D code, tonnes of crap removed 
v = &buffer.vertexes[0]; 
v->x = 0; v->y = 0; v->z = 0; 
v++; 
v->x = 1; v->y = 1; v->z = 0; 
v++; 
v->x = 2; v->y = 0; v->z = 0; 
c = &buffer.commands; 
c->operation = DRAW_TRIANGLE; 
c->vertexes[0] = 0; 
c->vertexes[1] = 1; 
c->vertexes[2] = 2; 
IssueExecuteBuffer (buffer); 

của nó không phải là quá xấu, ngày nay - nó chỉ mất Microsoft 10 phiên bản để làm cho nó đúng ...

0

Oracle của Pro C, Pro Ada, Pro * điều này-mà-the-khác. Chúng là một giao diện tiền xử lý trước cho C, Ada, và Fortran, tôi nghĩ, có lẽ một số khác, cho phép bạn mứt SQL vào mã nguồn của bạn.

Họ cũng có thư viện hoạt động tốt hơn nhiều và linh hoạt hơn nhiều.

(Đó là hơn 10 năm trước, tôi không có ý tưởng những gì họ làm gì bây giờ, mặc dù tôi sẽ không ngạc nhiên nếu nó vẫn giống nhau, chỉ để không phá vỡ mã của nhân dân.)