2008-11-28 29 views
6

Khi tôi lần đầu tiên bắt đầu lập trình, tôi đã viết mọi thứ trong chính. Nhưng như tôi đã học, tôi đã cố gắng làm ít nhất có thể trong các phương pháp main() của mình.Cách viết chính() theo cách OOP?

Nhưng nơi nào bạn quyết định để cung cấp cho người kia Lớp/Phương pháp trách nhiệm để tiếp nhận các chương trình từ main()? Bạn làm nó như thế nào?

Tôi đã nhìn thấy nhiều cách để làm việc đó, như thế này:

class Main 
{ 
    public static void main(String[] args) 
    { 
    new Main(); 
    } 
} 

và một số như:

class Main { 

    public static void main(String[] args) { 

    GetOpt.parse(args); 

    // Decide what to do based on the arguments passed 
    Database.initialize(); 
    MyAwesomeLogicManager.initialize(); 
    // And main waits for all others to end or shutdown signal to kill all threads. 
    } 
} 

gì nên và không nên được thực hiện trong main()? Hay không có viên đạn bạc?

Cảm ơn bạn đã dành thời gian!

Trả lời

7

Theo ý kiến ​​của tôi, "chính" của một dự án khá lớn nên chứa khoảng 3 chức năng cuộc gọi:

  • Gọi một chức năng khởi rằng thiết lập tất cả các thiết lập yêu cầu, sở thích, vv cho các ứng dụng.
  • Khởi động "bộ điều khiển" chính của ứng dụng
  • Đang đợi bộ điều khiển chính kết thúc và sau đó gọi chức năng Chấm dứt để dọn sạch mọi thứ cần được làm sạch trong "chính" (mặc dù bộ điều khiển sẽ có được chăm sóc phần lớn dọn dẹp rồi).

Bất kỳ ứng dụng đáng kể nào sẽ được chia thành nhiều phần chức năng, thường là với một số phân cấp. Bộ điều khiển chính có thể có nhiều bộ điều khiển con cho các tính năng cụ thể.

Làm theo cách này làm cho nó dễ dàng hơn để xác định vị trí chức năng cụ thể, và chia ly-of-lo ngại là tốt hơn.

Tất nhiên, như các câu trả lời khác đã nói, thực sự không có viên đạn bạc trong phát triển phần mềm. Đối với một dự án ngắn tôi có thể đặt tất cả mọi thứ trong chính chỉ để có được những thứ lên và chạy một cách nhanh chóng. Tôi nghĩ cũng phụ thuộc vào ngôn ngữ - một số tùy chọn có thể dễ dàng hơn những ngôn ngữ khác trong ngôn ngữ cụ thể.

0

Tôi nghĩ phương pháp chính nên giải thích, chương trình nào bắt đầu. Vì vậy, nó có thể gọi phương pháp khởi tạo, nhưng logic nên được trích xuất thành các phương pháp.

Trong ví dụ của bạn, tôi sẽ không tạo phương thức Main(), nhưng đặt nó vào phương thức gốc.

4

Bất cứ điều gì nổi thuyền của bạn, như họ nói. :) Bạn nên thực sự tập trung vào việc làm cho mã đơn giản, dễ đọc và hiệu quả, sử dụng bất kỳ công cụ nào bạn cần để đạt được điều này. Nếu nó đảm bảo đặt rất nhiều mã trong chính - làm như vậy. Nếu bạn cảm thấy rằng các đồ vật sẽ làm cho mọi thứ được tổ chức hơn - hãy đi theo cách đó.

Tạo một phiên bản class Main và sau đó gọi phương thức thể hiện Main() mà tất cả các công việc đều tốt như viết mọi thứ trong phương thức chính trực tiếp.

0

Thiết kế chương trình của bạn sẽ quyết định hình dạng "chính" của bạn.

Có "quy tắc" cho biết chức năng chính của bạn nên như thế nào, là - IMHO - không có ý nghĩa.

2

Tôi sẽ nói rằng đó không phải là chức năng chính của bạn, nhưng không có gì. Tùy thuộc vào sự phức tạp của dự án của bạn, bạn sẽ muốn chia nhỏ nó thành các phần chức năng, như "Chức năng cơ sở dữ liệu", "Chức năng hiển thị", "Trà cao với Vicar", v.v.

Đó là tất cả về khả năng đọc của mã. Có thể ai khác, người chưa bao giờ thấy chương trình của bạn trước khi đi qua nó, và có được lúc đầu, một ý tưởng tổng quát tốt về những gì nó làm gì?

Sau đó, có thể dễ dàng xem nơi cần đi sâu hơn một chút vào cơ chế không?

Mỗi phần chức năng mà bạn sử dụng chỉ thực hiện một quy trình lôgic hợp lý? Nó không phải chỉ làm một điều, nhưng nó không nên làm tất cả mọi thứ cộng với bồn rửa nhà bếp.

Chia nhỏ mã của bạn theo cách mà mã nguồn có thể duy trì bởi nguồn bên ngoài.

trời Nguyên nhân biết, khi nói phải xuống đến nó, nếu ai đó -else- có thể sửa chữa các lỗi, đó là tất cả = tốt hơn)

Như một câu trả lời trực tiếp câu hỏi của bạn, tôi sẽ đặt các cuộc gọi chức năng cho mỗi thành phần chính trong phần chính, quá trình thiết lập, quá trình và kết thúc, để bất kỳ ai nhìn vào nó đều có được tổng quan nhanh về cách chương trình hoạt động. Sau đó, họ có thể đi sâu hơn nếu cần.

17

Mã trong các chức năng chính:

  • có thể không phải là đơn vị thử nghiệm.
  • Không thể nhận phụ thuộc bằng cách tiêm.
  • Không thể sử dụng lại các ứng dụng khác tương tự như ứng dụng đầu tiên bạn viết.

Do đó mã trong chức năng chính:

  • Phải là đơn giản như vậy mà bạn hài lòng với chỉ kiểm tra chức năng/hệ thống.
  • Phải chịu trách nhiệm thiết lập tính năng lăn bóng cho các phụ thuộc được sử dụng bởi tất cả các mã khác của bạn (có nghĩa là các hành vi chính như một nhà máy sản xuất ứng dụng của bạn).
  • Chỉ nên thực hiện những điều cụ thể theo cách ứng dụng của bạn được thiết lập (nghĩa là không phải bất kỳ nội dung nào kiểm tra mã hoặc phiên bản demo sẽ cần phải thực hiện chính xác theo cách tương tự).

Trong thực tế, điều này có nghĩa là ứng dụng thực không có nhiều phần chính. Các ứng dụng đồ chơi và các chương trình một lần có thể có khá nhiều điểm chính, bởi vì bạn không có kế hoạch thử nghiệm hoặc sử dụng lại chúng.

Thực ra, một số điều tôi nói ở trên là C++ - cụ thể. Tất nhiên, các phương thức chính của Java có thể được gọi bằng mã thử nghiệm hoặc các ứng dụng biến thể. Nhưng họ vẫn không lấy các đối tượng như các tham số, chỉ các đối số dòng lệnh, do đó mức độ mà chúng có thể bị cô lập dưới sự kiểm tra, hoặc hoạt động tốt về mặt tái sử dụng, là khá thấp. Tôi đoán bạn có thể vượt qua tên lớp để họ khởi tạo và sử dụng để tạo phần còn lại của ứng dụng.

[Chỉnh sửa: ai đó đã xóa thẻ "C++, Java" khỏi câu hỏi này. Vì vậy: những gì tôi nói ở trên là C++ và Java cụ thể.Các ngôn ngữ khác có thể xử lý chính theo cách ít đặc biệt hơn, trong trường hợp đó có thể không có lý do cụ thể nào để bạn đặc biệt đối xử với nó.]

2

Xem nội dung và hình thức của phương pháp "chính" là rất ngôn ngữ và phụ thuộc vào môi trường. Trong Java, mỗi lớp có thể có phương thức public static void main(), vì vậy hoàn toàn khả thi để có nhiều hơn một. Nhưng bây giờ, chúng ta hãy suy nghĩ về điều này thông qua định luật mô-đun hóa của Parnas: "mỗi mô-đun che giấu một bí mật, và bí mật đó là cái gì đó có thể thay đổi." "Bí mật" của mô-đun được gọi ban đầu là chi tiết về giao tiếp với hệ điều hành: những thứ như nhận các đối số và xử lý các chấm dứt bất thường. Trong Python, điều này dẫn đến một cái gì đó như thế này:

def main(args=None): 
    #argument processing 
    #construct instances of your top level objects 
    #do stuff 

if __name__ == "__main__": 
    try: 
     main(Sys.Argv) 
    except: # everything 
     # clean up as much as you can 
    else: 
     # normal cleanup, no exceptions 

Điểm ở đây là bạn nhận được mọi thứ từ môi trường bạn có thể, sau đó gọi hàm main(); bạn nắm bắt tất cả các ngoại lệ không bị bắt và bạn làm điều gì đó thông minh với chúng trước khi chương trình chết.

0

Hãy nhớ rằng nếu ai đó muốn có ý tưởng về cách chương trình của bạn hoạt động, địa điểm đầu tiên có thể họ sẽ xem là chính (ít nhất là tôi sẽ làm). Vì vậy, tôi không nghĩ rằng đó là một ý tưởng tốt để đưa càng ít trong nó càng tốt. Nhưng tôi sẽ nói để đưa ra ít nhất là cần thiết để có được cái nhìn của một con chim về cách chương trình của bạn hoạt động.

Vì vậy, tôi nghĩ mối quan tâm lớn nhất của bạn trong việc triển khai chức năng chính là dễ đọc.

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