2008-11-19 43 views
9

Ví dụ tồi tệ nhất (do sự phổ biến hoặc mức độ nghiêm trọng) của sự đảo ngược trừu tượng mà bạn thấy trong lập trình ngày hôm nay là gì?Nghịch đảo trừu tượng tồi tệ nhất

Đối với những người bạn không quen thuộc với khái niệm này, sự đảo ngược trừu tượng đang triển khai các cấu trúc cấp thấp trên các cấu trúc cấp cao. Chính xác hơn, giả sử bạn có các cấu trúc A và B. B được triển khai trên đầu A, nhưng A không bị lộ ra bất cứ đâu. Do đó, nếu bạn thực sự cần cấu trúc A ở mức thấp hơn, bạn sẽ thực hiện A trên đầu B, khi B được triển khai theo A ở vị trí đầu tiên. Xem http://en.wikipedia.org/wiki/Abstraction_inversion.

+1

wiki cộng đồng? – wheaties

Trả lời

9

Có lẽ ví dụ tồi tệ nhất về lạm dụng trừu tượng mà tôi từng thấy là this fluent C#, bao gồm các yếu tố kiểm soát luồng cơ bản (nếu, whiles, biểu thức được sắp xếp) trong giao diện thông thạo.

Vì vậy, một cách hoàn hảo ngữ, mã sạch của bạn:

var selectedTextBox = (TextBox)sender, 
if (IsAdmin) 
{ 
    selectedTextBox.Enabled = true; 
    selectedTextBox.Text = superSecretPassword; 
} 
else 
{ 
    selectedTextBox.Clear(); 
} 

trở thành mớ hỗn độn này:

Cast<TextBox>(sender). 
    WithIf(IsAdmin, 
     With(selectedTextBox => selectedTextBox.Enabled = true). 
     With(selectedTextBox => selectedTextBox.Text = superSecretPassword), 
     With(selectedTextBox => selectedTextBox.Clear()); 

Bởi vì mọi thứ đều tốt hơn với lambdas!

1

Tôi không chắc chắn nếu điều này trả lời câu hỏi của bạn, nhưng tôi đã nhìn thấy điều này (và tôi đã phạm tội), nơi một ngôn ngữ cấp cao đẹp như Lisp được sử dụng như thể nó là Fortran hoặc thậm chí Ngôn ngữ hội, bởi vì đó là cấp độ của lập trình viên.

IMHO, đó là một trong những sự mỉa mai của tính toán cho dù ngôn ngữ cấp cao như thế nào, nếu nó là ngôn ngữ phổ quát, nó có thể được sử dụng ở mức thấp nhất. Tinh vi không đảm bảo sự tinh tế.

+2

Không thực sự. Các ngôn ngữ cấp cao thường được thiết kế để bạn có thể lập trình ở cấp độ thấp hơn nếu không có cách nào tốt để thể hiện những gì bạn muốn ở mức cao. Điều này giống như việc không sử dụng sự trừu tượng, thay vì đảo ngược nó. – dsimcha

2

Điều này có vẻ như là một chủ đề khá chết. Tôi sẽ trả lời câu hỏi của riêng tôi chỉ để bắt đầu một số cuộc thảo luận. Tôi muốn nói sự đảo ngược trừu tượng tồi tệ nhất mà tôi đã thấy là sử dụng các lớp/giao diện trừu tượng kiểu OOP để nhân rộng các con trỏ hàm. Ví dụ:

interface foo { 
    int bar(); 
} 

class myClass1 implements foo { 
    // No member variables. 

    int bar() { 
     // Implementation 
    } 

    // No other methods. 
} 

class myClass2 implements foo { 
    // No member variables. 

    int bar() { 
     // Implementation 
    } 

    // No other methods. 
} 

Lớp học được coi là một sự trừu tượng mạnh mẽ khi bạn cần đóng gói cả trạng thái và hành vi. Một con trỏ hàm là một cái gì đó tương đối đơn giản được sử dụng để chỉ chứa hành vi. Các hàm ảo được thực hiện bằng cách sử dụng các mảng của các con trỏ hàm, nhưng nhiều ngôn ngữ OO không hiển thị con trỏ hàm hoặc bất kỳ thứ gì tương đương trực tiếp. Do đó, bạn kết thúc bằng cách sử dụng các giao diện và các lớp để thực hiện chức năng tương đương với các con trỏ hàm và các lớp và giao diện này được thực hiện theo các con trỏ hàm. Điều này dẫn đến sự phức tạp không cần thiết và hiệu suất giảm.

+1

Tôi ghét nhìn thấy một câu hỏi thú vị cũng đã chết. Như bạn có thể nói từ các câu trả lời khác của tôi, tôi nghĩ có quá nhiều ý tưởng thờ phượng trong lĩnh vực này (như việc bạn sử dụng từ "mạnh mẽ") thay cho kế toán đơn giản về ưu và nhược điểm. –

+4

C#, F #, Delphi, C++, Python, Ruby, OCaml, Perl, Javascript, Scala, Lisp + Clos, D và một loạt các ngôn ngữ OOP khác hỗ trợ lambdas và các hàm hạng nhất. Java thực sự là ngôn ngữ "lớn" duy nhất còn lại để thêm hỗ trợ cho các con trỏ hàm. – Juliet

0

Câu trả lời hoặc câu hỏi khác, nếu bạn không phiền. Liệu từ "trừu tượng" thực sự có một định nghĩa? Tóm tắt có thực sự tốt hay xấu, hoặc trung tính? Ý tôi là, tôi hiểu số 2 là trừu tượng vì nó là viết tắt của những gì phổ biến về 2 đôi giày, 2 mắt, 2 chu kỳ, vv. Một giao diện IStack có thể trừu tượng bởi vì nó áp dụng cho những thứ hoạt động như ngăn xếp. Nhưng nếu chương trình con A gọi chương trình con B thì điều đó có nghĩa là nó trừu tượng hơn? Tại sao chúng ta say mê từ này?

EDT: Tôi chỉ hỏi vì tôi đã thấy mọi người bật mũi của họ về các vấn đề "cụ thể", nghĩ rằng rừng là quan trọng hơn cây.

0

Tôi không chắc chắn nếu điều này thực sự đủ điều kiện, nhưng có vẻ như có liên quan. Khi SQL Server 2005 ra mắt với các khả năng CLR, tôi nghe thấy một loạt các nhà phát triển nói những điều như "tốt, bây giờ chúng ta có thể kích hoạt các cuộc gọi dịch vụ Web trực tiếp từ các thủ tục lưu trữ của chúng ta!" Tôi cũng thấy một số hướng dẫn về việc này. Đó là một số mức trừu tượng xung đột.

1

Việc sử dụng thư viện bộ sưu tập thủ tục phía máy khách để xử lý tập hợp kết quả SQL.

0

ví dụ tồi tệ nhất (do một trong hai tỷ lệ hoặc mức độ nghiêm trọng) của trừu tượng đảo ngược mà bạn nhìn thấy trong lập trình hôm nay là gì?

Tôi không biết nếu điều này đếm, nhưng tôi thường bị khó chịu khi tôi nhìn thấy các lớp học được đặt tên theo họ thực hiện thay vì những gì họ đang cho. Nó thực sự là một loại ký hiệu Hungarian, quan sát:

  • CustomerFactory
  • DecisionTreeVisitor
  • AbstractWindowDecorator
  • JsonDataAdapter
  • TabbedDocumentImpl
  • ConcreteListHandler

"Nhà máy", "khách" , "Trang trí", "Bộ điều hợp", "Impl", "Bê tông" - ai quan tâm nó được thực hiện như thế nào, nó được dùng để làm gì?

+3

Nhà máy, bộ điều hợp và xử lý là tất cả các ứng dụng hợp pháp hoàn hảo cho một cái gì đó theo ý kiến ​​của tôi: một nhà máy làm cho công cụ, một bộ điều hợp thích nghi công cụ và xử lý một công cụ. Impl, bê tông và (debatably) khách truy cập chỉ là ký hiệu ngớ ngẩn mặc dù. –

1

Làm thế nào để mô phỏng goto trong lập trình cấu trúc thông qua việc sử dụng các biến boolean cờ? Tuy nhiên, lập trình cấu trúc đã trở nên được chấp nhận chung. Đây không phải là dấu hiệu cho thấy sự đảo ngược trừu tượng không phải lúc nào cũng là một điều xấu sao?

+0

Yêu câu trả lời. Tuy nhiên, tránh các biến cờ là loại lý do tại sao ngôn ngữ có cấu trúc hiện đại đã phá vỡ và tiếp tục, và một số thậm chí còn có nhãn phá vỡ và tiếp tục. Mặc dù vậy, tôi vẫn sử dụng goto ** thỉnh thoảng ** để tránh làm tổ quá mức và nhảy trước trong một hàm khi xử lý các trường hợp đặc biệt. Nó thực sự làm cho mã dễ đọc hơn, và tôi có xu hướng khó chịu khi tôi bị buộc phải lập trình bằng ngôn ngữ mà không có goto. – dsimcha

Các vấn đề liên quan