Các phản hồi của chính trong lập trình hướng đối tượng là gì?


10

Tôi chưa quen với lập trình hướng đối tượng và tôi không hiểu mục đích chính là gì.

Vâng, tôi đọc rằng đó là "điểm vào" của chương trình nhưng điều tôi không hiểu là cái gì nên có trong chính? Và trách nhiệm của nó là gì?

Nó có thể xảy ra rằng một cái gì đó được viết trong chính có thể được gói gọn trong một đối tượng khác, nhưng bạn nên sử dụng phương pháp này bao nhiêu?

Đây là chính đầu tiên của tôi, tôi đã viết bằng Java, nó rất đơn giản nhưng nó có thể khiến bạn hiểu rõ hơn về nghi ngờ của tôi. Tôi có một lớp Động vật trừu tượng được mở rộng bởi "Cat" và "Dog". Tôi đã sử dụng chính để tạo một số đối tượng và cũng như một "giao diện" với người dùng, thực sự như bạn thấy tôi đã sử dụng một số hướng dẫn có điều kiện để "hỏi người dùng" những gì anh ta muốn làm.

Câu hỏi của tôi xuất phát từ thực tế là giao diện có thể được gói gọn trong một đối tượng khác và không giao trách nhiệm đó cho chính.

    public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    System.out.println("What type of animal do you want to create? \n dog cat");
    String type = input.nextLine();
    if ( Objects.equals(type, "dog")){
        System.out.println("Enter the animal's age: ");
        int age = input.nextInt(); // Scans the next token of the input as an int.
        System.out.println("Enter the animal's name: ");
        String name = input.next();
        Dog first = new Dog(name, age);
    }
    else if ( Objects.equals(type, "cat")) {
        System.out.println("Enter the animal's age: ");
        int age = input.nextInt(); // Scans the next token of the input as an int.
        System.out.println("Enter the animal's name: ");
        String name = input.next();
        Cat first = new Cat(name, age);
    }

    else{
        System.out.println("Error: the specified type does not exist.");
    }
    System.out.println("The number of animals is:" + numberOfAnimals);
}

2
Các mainchức năng không phải là một khái niệm từ OOP.
Andres F.

Câu trả lời:


10

Trước hết, ví dụ của bạn không phải là một chương trình hướng đối tượng. Đây là một chương trình thủ tục xảy ra để lưu trữ dữ liệu trong các đối tượng, vì đó là công cụ mà ngôn ngữ của bạn (Java?) Cung cấp cho dữ liệu có cấu trúc.

Một chương trình hướng đối tượng thực sự bao gồm các đối tượng tương tác với nhau - đó là về hành vi chứ không phải dữ liệu (Tôi nhận ra đó là một tuyên bố gây tranh cãi, vì vậy đây là một liên kết nơi bạn có thể thấy nhiều định nghĩa về hướng đối tượng từ những người có nhiều thông tin hơn hơn tôi, lưu ý rằng hành vi xuất hiện ở hầu hết trong số họ).

Trong một chương trình hướng đối tượng thực sự, theo định nghĩa tôi sử dụng, bạn có các đối tượng độc lập tương tác với nhau. Vai trò của mainhàm là tạo các đối tượng ban đầu và nối chúng lại với nhau.

Ví dụ đơn giản, hãy xem xét một ứng dụng web được xây dựng trên cơ sở dữ liệu. Ứng dụng này có thể được chia thành các đối tượng theo nhiều cách, nhưng đây là một trong số đó: một Networkingđối tượng chấp nhận kết nối, phân tích yêu cầu HTTP và gửi đến một Controllerđối tượng thích hợp , tương tác với một Databaseđối tượng và tạo ra phản hồi (nếu bạn muốn để liên kết một hoặc nhiều Viewđối tượng với mỗi bộ điều khiển, vui lòng làm như vậy). Bạn cũng có thể thêm một Threadpoolđối tượng để cung cấp các luồng thực thi riêng biệt.

Vai trò của mainứng dụng này có thể là:

  1. Tạo Databaseđối tượng
  2. Tạo tất cả các Controllerđối tượng và liên kết chúng với Databaseđối tượng
  3. Tạo Networkđối tượng và liên kết tất cả các Controllerđối tượng với nó.
  4. Bắt đầu Networkchạy đối tượng (cũng có thể liên quan đến việc tạo Threadpoolvà nối nó vào Network).

Các bước thiết lập này có thể được chỉ định rõ ràng trong mainhoặc chúng có thể được xử lý bởi một số đối tượng khác. Ví dụ, trong một ứng dụng Spring điển hình, tất cả những gì mainchức năng thực hiện là tạo bối cảnh ứng dụng (một đối tượng). Điều này kích hoạt việc tạo và nối dây của tất cả các đối tượng được đề cập trong cấu hình cho bối cảnh ứng dụng đó.


1
Xem Newspeak cho một ví dụ về một ngôn ngữ mà mất OO rất nghiêm trọng rằng một cái gì đó giống như một mainphương pháp thậm chí không thể tồn tại.
Jörg W Mittag

1
Câu trả lời tốt, nhưng nếu tôi là bạn, tôi cũng đã đề cập đến Dependency Injection.
Arseni Mourzenko

Tôi thấy những gì bạn có ý nghĩa về mã của tôi không được hướng đối tượng. Tôi đã không chú ý, nhưng trên thực tế, các đối tượng tôi tạo ra không có bất kỳ hành vi nào. Tuy nhiên, để làm cho nó "nhiều OO" hơn, một ý tưởng có thể tạo ra một số đối tượng khác "sử dụng" những đối tượng tôi đã có, tuy nhiên, tốt hơn hết là không nên có tất cả các đối tượng mà không có phương thức?
Elia

@Elia - Không, nó sẽ không tốt hơn. Có giá trị để có dữ liệu có cấu trúc được gõ và đặt tên (so với chỉ bỏ dữ liệu vào a Map). Nhưng Java chỉ cung cấp một cách để làm điều này (so với C ++, phân biệt giữa các cấu trúc và các lớp). Vì vậy, xác định các lớp không có hành vi, bởi vì điều đó làm cho chương trình của bạn dễ hiểu hơn, nhưng nhận ra rằng làm như vậy không làm cho chương trình của bạn "hướng đối tượng".
kdgregory

1

Vâng, nó phụ thuộc. Đưa nó đến hai thái cực:

  1. Đặt tất cả các dòng mã theo dòng trong của bạn main. Điều đó sẽ biên dịch và chạy độc đáo. Nhưng đối với một con người, mã sẽ không thể tiêu hóa được.
  2. Chỉ cần đặt một chức năng duy nhất mainvà gọi nó doWhatNeedsToBeDonevà cuối cùng tiếp tục trong thói quen này theo cùng một cách. Bây giờ bạn đã rất gọn gàng mainnhưng tất nhiên, bạn không có được những gì cần phải làm.

Vì vậy, sự thật là một nơi nào đó ở giữa. Hãy thử tạo một maintrang phù hợp với một trang, để ai đó có thể nhận được những hướng dẫn chính cần được thực hiện. Lấy đúng đường viền đơn giản chỉ là vấn đề kinh nghiệm.

Trên đây là một quy tắc chung và áp dụng cho OO cũng như lập trình chức năng.


1

Phương thức chính tĩnh tồn tại như một sự chuyển đổi từ thế giới không hướng đối tượng sang thế giới hướng đối tượng. Nó đã được thực hiện theo cách này kể từ ít nhất là C ++ trong thập niên 80.

Các phương thức tĩnh về cơ bản là các phương thức không hướng đối tượng: chúng có thể là các phương thức thủ tục; chúng có thể là phương pháp chức năng. Khái niệm về các phương thức tĩnh về cơ bản là một lối thoát của OOP đến các mô hình lập trình khác.

Java, C # và C ++ đều sử dụng main tĩnh như một sự chuyển đổi từ chính kiểu C truyền thống sang ngôn ngữ lập trình tương ứng của họ, từ đó bây giờ bạn có thể chọn sử dụng các đối tượng (hoặc không) theo ý muốn.

Các ngôn ngữ này có thể đã yêu cầu một đối tượng cá thể nguyên thủy thay vì chính tĩnh, nhưng đã chọn cách tiếp cận chính tĩnh thay thế. Sử dụng một cách tiếp cận cá thể thay thế, mainlớp sẽ là một lớp con của threadlớp và thời gian chạy ngôn ngữ sẽ tạo ra một thể hiện đối tượng ban đầu của mainlớp và sau đó gọi runphương thức cá thể của nó , theo cách mà các luồng bổ sung được khởi chạy / tạo.

Nhưng về mặt lịch sử, nó đã được thực hiện theo một cách khác: một phần, các ngôn ngữ này chỉ tuân theo, và một phần, vì luồng không phải là ưu tiên trở lại trong những ngày đó nên chúng sử dụng phương pháp tĩnh đơn giản hơn.

Ngoài ra, cách tiếp cận chính tĩnh "đơn giản" hơn ở chỗ bạn không phải sử dụng phân lớp, do đó, các chương trình hướng dẫn tầm thường hello worldđơn giản hơn theo một nghĩa nào đó (tuy nhiên chúng sử dụng tương đối khó giải thích static, khó giải thích cho ai đó khi bạn đầu tiên cố gắng dạy OOP.)


-1

Phương thức Main () được sử dụng để chạy chương trình

Trách nhiệm - Khi bạn bắt đầu chạy chương trình của mình, Phương thức Main () gọi các phương thức khác để bắt đầu chạy chương trình của bạn.

Đây là một câu trả lời đơn giản giúp tôi hiểu trách nhiệm của phương thức Main () là gì.

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.