Phương thức chính chỉ nên bao gồm các sáng tạo đối tượng và các cuộc gọi phương thức?


12

Một người bạn của tôi nói với tôi rằng, cách thực hành tốt nhất là lớp chứa mainphương thức nên được đặt tên Mainvà chỉ chứa mainphương thức. Ngoài ra mainphương thức chỉ nên phân tích cú pháp đầu vào, tạo các đối tượng khác và gọi các phương thức khác. Các Mainlớp học và mainphương pháp không nên làm bất cứ điều gì khác. Về cơ bản những gì anh ta đang nói rằng lớp chứa mainphương thức nên giống như:

public class Main
{
    public static void main(String[] args)
    {
        //parse inputs
        //create other objects
        //call methods
    }
}

Đó có phải là thực hành tốt nhất?


6
có thể làm gì khác?
Pubby

Câu trả lời:


11

Điểm mà bạn của bạn đang đưa ra là một ứng dụng chỉ nên được khởi động bằng phương thức chính, và không có gì nữa. Bằng cách có phương thức chính trong lớp riêng của nó, bạn chỉ cần củng cố thực tế đó bằng cách giữ cho nó độc lập với bất kỳ logic ứng dụng nào. Vai trò của phương thức chính là phân tích bất kỳ đầu vào nào và khởi tạo ứng dụng với các đầu vào đó, và có thể là các đầu vào khác.

public static void main(String[] args){
    new Foo().start(args[0]);
}

Ý tưởng là bạn không cần phương thức chính để khởi tạo Foo. Điều này cho phép bạn dễ dàng khởi tạo và bắt đầu Footrong một bối cảnh khác, có khả năng với các ngữ nghĩa khác nhau.

public Foo initSomewhereElse(String arg){
    Foo f = new Foo();
    f.start(arg);
    return f;
}

7

Phương thức main () là một nhược điểm xấu cho lập trình thủ tục, cung cấp điểm vào trong ứng dụng. Nỗ lực được thực hiện bằng nhiều ngôn ngữ lập trình khác nhau để gói gọn nó, nhưng chính bản chất của nó làm cho điều này trở nên khó khăn (nó phải công khai và tĩnh, nhưng KHÔNG BAO GIỜ được gọi từ bất kỳ thứ gì khác trong chương trình, điều này rất mâu thuẫn). WPF đã thành công (bằng cách ẩn main () khỏi bạn trong phần sâu của dự án ứng dụng WPF và cung cấp các "hook" có thể định cấu hình để xử lý tùy chỉnh), cũng như Java (theo cách tương tự cho các ứng dụng Android), nhưng WinForms và hầu hết các loại khác các ứng dụng vẫn khiến bạn phải đối phó với hàm main ().

Vì vậy, hầu hết các chuyên gia nói rằng LỘC của hàm main () nên càng thấp càng tốt. Có một cách tiếp cận (mà tôi nghĩ là hơi quá mức) trong đó hàm main () có một dòng:

public class Program
{
   private Program(string[] args)
   {
      //parse args and perform basic program setup
   }

   //Reduce the ugliness to the absolute minimum
   public static void main(string[] args)
   {
      new Program(args).Run();  
   }

   private void Run()
   {
      //kick off the driving O-O code for the app; i.e. Application.Run()
   }    
}

Điều này hơi nhiều, nhưng tôi đồng ý với nguyên tắc cơ bản; main () nên càng ít càng tốt để đưa ứng dụng hướng sự kiện, hướng đối tượng của bạn vào trạng thái "sẵn sàng".


Tôi không đồng ý. Nó có thể hữu ích để gọi maintừ các bối cảnh khác - ví dụ, đệ quy.
DeadMG

4
Cá nhân nếu bạn định kỳ phương thức chính của mình, tôi nghĩ thay vào đó bạn nên gọi một phương thức khác và định kỳ lại. Chỉ trong các bối cảnh đơn giản nhất (ứng dụng bảng điều khiển có độ phức tạp / khó khăn ở mức độ bài tập về nhà) mới có thể chấp nhận gọi main () từ trong chương trình của bạn và tôi sẽ gọi đó là một tình huống tầm thường.
KeithS

1

Trong các ngôn ngữ hỗ trợ các chức năng mainchỉ là một chức năng thông thường và do đó bạn không thể làm gì khác với chức năng đó ngoài những gì bạn đã nói. Và sau đó, có những ngôn ngữ ngu ngốc mà các chức năng bỏ qua có lợi cho việc mọi thứ đều là một đối tượng, có nghĩa là mỗi khi bạn muốn một chức năng, bạn phải bọc nó trong một lớp không cần thiết .

Chà, đủ lan man. Điểm tôi đang cố gắng thực hiện là đó Mainkhông thực sự là một lớp, mà là một hàm và vì vậy bạn không nên làm bất cứ điều gì ngoài phân tích cú pháp đầu vào, tạo các đối tượng khác và gọi các phương thức khác bởi vì đó là tất cả các hàm có thể làm.

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.