2010-10-25 26 views
8

Trong ứng dụng của tôi, tôi có một Controller được bắt đầu bằng phương pháp chính. Bộ điều khiển khởi tạo móc, kết nối cơ sở dữ liệu, giao diện người dùng, kết nối khác và các thứ khác. Nó nắm giữ hầu hết trạng thái của chương trình (không, nó không phải là Singleton). Trong một ví dụ khác có một bộ điều khiển cho bot xử lý việc giải thích và gửi ra khỏi các lệnh. Cả hai đều là các tệp khá lớn.Làm thế nào tôi có thể viết một Controller mà không biến nó thành một đối tượng của Chúa?

Tôi đã đọc lên các đối tượng của Thiên Chúa, nhưng tôi thực sự không biết cách nào để tách nó ra. Nếu tôi chia nhỏ thông dịch viên và điều phối viên trong bot, nó sẽ tạo ra một chuỗi cuộc gọi khủng khiếp (giống như getBot().getParser().getOutput().sendMessage(recipient, message)). Tương tự như vậy trong Controller đầu tiên nếu tôi chia nhỏ mọi thứ, bạn sẽ chỉ có các đối tượng Data chứa các trường và một số phương thức tiện ích bí danh. Tách chúng lên sẽ làm mọi việc tồi tệ hơn. Và trước khi bạn cho rằng nó không thể duy trì, nó thực sự là không. Tôi thậm chí không viết bộ điều khiển Bot nhưng tôi vẫn biết những gì đang xảy ra.

Vấn đề là lớp Bot dài 2000 dòng (có thể ngắn hơn nếu tôi lấy ra các chú thích Javadoc) và Bot dài khoảng 1000 dòng. Rất nhiều dòng = Thiên Chúa đối tượng. Nhưng liệu có ổn cho một hoặc hai lớp cốt lõi của một dự án?

+0

Liên quan: [Thiết kế một lớp theo cách sao cho nó không trở thành "đối tượng Thiên Chúa"] (http://stackoverflow.com/questions/2589703/designing-a-class-in-such-a- cách-mà-nó-không-trở thành-một-thần-đối tượng) –

+0

@ jleedev Tôi đã nhìn vào đó, nhưng đây là một chút của một vấn đề khác nhau. OP có thể làm các đối tượng phụ làm công việc tốt vì nó là tất cả nội bộ. Tuy nhiên, trường hợp của tôi là một bộ điều khiển API phải đối mặt công khai cần phải đơn giản, nơi tôi không thể làm cho bất kỳ đối tượng nào khác thực hiện công việc. – TheLQ

Trả lời

11

"Rất nhiều dòng" không có nghĩa là lớp là một đối tượng thần thánh, đó là một điểm chuẩn khủng khiếp để tìm ra bạn có nên refactor một cái gì đó hay không. Một số điều rất phức tạp và đảm bảo một đối tượng phức tạp và vốn có lớn. Ý tưởng về một đối tượng của Thiên Chúa là những gì lớp học không.

Ví dụ nếu tôi thực hiện một đối tượng mà có thể

DoMyTaxes() 
GiveMeHugs() 
LogThisError() 
StartGameLoop() 

Đối tượng được xem như là một đối tượng thần, ngay cả khi nó chỉ có thể là 100 dòng mã. Ý tưởng cơ bản là tất cả những điều trên đều hoàn toàn không liên quan (trong kết thúc logic kinh doanh của quang phổ) vậy tại sao trên thế giới tất cả chúng sẽ là một phần của cùng một đối tượng. Nếu tôi quyết định làm cho cái ôm kéo dài lâu hơn, tôi có thể sẽ làm tăng thuế của tôi. Nhập IRS.

Tuy nhiên, nếu bạn đang làm việc trên một mô phỏng vật lý, cho phép nói, và lớp Classical() sẽ có phương pháp/các đối tượng như:

Space() 
Time() 
Velocity() 
Speed() 
Mass() 
Acceleration() 
Gravity() 
Force() 
Impulse() 
Torque() 
Momentum() 
AngularMomentum() 
Inertia() 
MomentOfInertia() 
ReferenceFrame() 
Energy() 
KineticEnergy() 
PotentialEnergy() 
MechanicalWork() 
VirtualWork() 
DAlembertsPrinciple() 

(biếu không của Wikipedia)

Đối tượng này sẽ không là một vật thần.Đó là một đối tượng phức tạp. Tất cả mọi thứ liên quan đến vật lý Newton đi qua nó, nhưng nó không phải là một đối tượng Thiên Chúa .. nó chỉ là một đối tượng thực sự thực sự lớn. Ở trên có thể kết thúc là hàng ngàn dòng mã.

Đối tượng Quantum() thậm chí còn phức tạp hơn, không cần phải nói.

Nói cách khác, ý tưởng về một chương trình hành vi, không dữ liệu chảy:

bạn không quan tâm liệu một đối tượng duy nhất nắm giữ rất nhiều dữ liệu của ứng dụng, hoặc liệu hầu hết các luồng phải đi qua một đối tượng duy nhất. Điều gì có tác động nhiều hơn về khả năng bảo trì là khi một Thiên Chúa duy nhất Lớp (tm) có quá nhiều hành vi (mã doanh nghiệp).

Nếu bạn cho rằng có sự cố, bạn có thể thử triển khai các hình thức khác nhau của mediation hoặc các mẫu xấu hơn như dependency injection.

+0

Câu trả lời hay. Theo nguyên tắc đó, tôi đoán đối tượng của tôi chỉ phức tạp vì nó xử lý cả phân tích cú pháp, đầu ra và móc (mặc dù móc đang di chuyển ra ngoài). Cảm ơn bạn đã trả lời – TheLQ

+0

câu trả lời thực sự tốt, +1 –

3

Nếu bạn không thoải mái với kích thước và độ phức tạp của một lớp học, thì đó thường là một chỉ báo tốt cho thấy một thiết kế tốt hơn có thể được thực hiện. Nhưng đừng đo lường về kích thước. Nếu một lớp dễ hiểu và dễ hiểu, nhưng có rất nhiều mã, điều đó không nhất thiết có nghĩa là nó là ứng cử viên cho việc tái bao thanh toán. Tôi đã thấy mọi người bị cuốn theo điều này và sự lộn xộn mà họ tạo ra trong việc theo đuổi việc làm những thứ nhỏ bé trở nên tồi tệ hơn so với mã gốc. Mặt khác, tôi đã đọc qua các lớp từ đầu đến cuối nhiều lần và vẫn không biết họ làm gì.

Câu hỏi mà tôi muốn hỏi là - Nếu tôi cung cấp cho nhà phát triển khác, họ có thể dễ dàng hiểu và duy trì nó không?

Nếu câu trả lời là có, thì tỷ lệ cược là bạn không cần phải làm gì cả. Nếu không, thì việc tính lại tiền là theo thứ tự.

Với tham chiếu đến đối tượng thần, đọc bài đăng của bạn, có vẻ như lớp học này đang làm quá nhiều. Tôi tự hỏi nếu trước hết bạn có thể tái yếu tố nhà nước thành một tập hợp các đối tượng mô hình như là một điểm khởi đầu. Sau đó, lớp học của bạn bắt đầu trông giống như một nhà máy cấu hình của một số loại.

2

Tôi cho rằng động cơ vật lý/chuyển động chắc chắn phải tách biệt với trình thông dịch ngôn ngữ; mặc dù trình thông dịch ngôn ngữ sẽ cần truy cập vào một số phương thức và thuộc tính công khai của công cụ vật lý, không có lý do nào mà hai khía cạnh của robot phải ở trong cùng một lớp. Bản dịch ngôn ngữ chính nó có thể được chia nhỏ thành một vài lớp, như động cơ chuyển động. Có thể có một đối tượng điều khiển chính, nhưng nó phải có một số lượng mã tương đối nhỏ. Nó, động cơ chuyển động chính, và động cơ ngôn ngữ chính, tất cả nên phân công hầu hết công việc của họ cho các đối tượng bao gồm chúng.

0

Tôi nghĩ nguyên tắc chính ở đây là "sự gắn kết".

DoMyTaxes() 
GiveMeHugs() 
LogThisError() 
StartGameLoop() 

..không được cố kết.

Cái gì như:

GiveMeHug() 
GiveMeKisses() 
GiveMeHugs(int noOfTimes) 
GiveMeHugs(int noOfTimes, Person person) 
GiveMeHugsAndKisses() 

..is gắn kết vì tất cả các phương pháp này là khá tương tự. Bạn có thể có 1000 phương pháp gắn kết trong một lớp và nó sẽ vẫn không phải là một đối tượng thần, vì trách nhiệm của lớp vẫn còn hạn chế.

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