อะไรคือความรับผิดชอบหลักในการเขียนโปรแกรมเชิงวัตถุ?


10

ฉันใหม่สำหรับการเขียนโปรแกรมเชิงวัตถุและฉันไม่เข้าใจว่าจุดประสงค์หลักของอะไร

ใช่ฉันอ่านว่ามันเป็น "จุดเริ่มต้น" ของโปรแกรม แต่สิ่งที่ฉันไม่เข้าใจคือสิ่งที่ควรจะเป็นในหลัก และความรับผิดชอบของมันคืออะไร?

อาจเกิดขึ้นว่าสิ่งที่เขียนในหลักอาจถูกห่อหุ้มในวัตถุอื่น แต่คุณควรใช้วิธีการนี้มากแค่ไหน?

นี่คือหลักแรกของฉันที่ฉันเขียนใน Java มันง่ายมาก แต่อาจทำให้คุณเข้าใจข้อสงสัยของฉันดีขึ้น ฉันมีสัตว์ที่เป็นนามธรรมซึ่งขยายโดย "Cat" และ "Dog" ฉันใช้หลักในการสร้างวัตถุบางอย่างและยังเป็น "ส่วนต่อประสาน" กับผู้ใช้ด้วยอย่างที่คุณเห็นฉันใช้คำสั่งแบบมีเงื่อนไขเพื่อ "ถามผู้ใช้" สิ่งที่เขาต้องการจะทำ

คำถามของฉันเกิดขึ้นจากความจริงที่ว่าอินเทอร์เฟซสามารถถูกห่อหุ้มในวัตถุอื่นและไม่ให้ความรับผิดชอบหลัก

    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
mainฟังก์ชั่นไม่ได้เป็นแนวคิดจาก OOP
Andres F.

คำตอบ:


10

ก่อนอื่นตัวอย่างของคุณไม่ใช่โปรแกรมเชิงวัตถุ มันเป็นโปรแกรมขั้นตอนที่เกิดขึ้นในการจัดเก็บข้อมูลในวัตถุเพราะนั่นคือเครื่องมือที่ภาษาของคุณ (Java?) ให้ไว้สำหรับข้อมูลที่มีโครงสร้าง

โปรแกรมเชิงวัตถุที่แท้จริงประกอบด้วยวัตถุที่มีปฏิสัมพันธ์ซึ่งกันและกัน - เป็นเรื่องของพฤติกรรมมากกว่าข้อมูล (ฉันรู้ว่ามันเป็นคำแถลงที่ขัดแย้งกันดังนั้นนี่คือลิงค์ที่คุณสามารถดูคำจำกัดความของการวางแนววัตถุจากคนที่มีข้อมูลประจำตัวมากกว่า กว่าฉันโปรดทราบว่าพฤติกรรมส่วนใหญ่จะปรากฏขึ้น)

ในโปรแกรมเชิงวัตถุที่แท้จริงตามคำนิยามที่ฉันใช้คุณมีวัตถุอิสระที่โต้ตอบซึ่งกันและกัน บทบาทของmainฟังก์ชั่นคือการสร้างวัตถุเริ่มต้นและโยงเข้าด้วยกัน

ตัวอย่างง่ายๆให้พิจารณาเว็บแอปพลิเคชันที่สร้างขึ้นจากฐานข้อมูล แอปพลิเคชันนี้สามารถแตกออกเป็นวัตถุได้หลายวิธี แต่นี่คือหนึ่งในนั้น: Networkingวัตถุที่ยอมรับการเชื่อมต่อแยกคำขอ HTTP และส่งไปยังControllerวัตถุที่เหมาะสมซึ่งโต้ตอบกับDatabaseวัตถุและสร้างการตอบสนอง (ถ้าคุณต้องการ เมื่อต้องการเชื่อมโยงViewวัตถุหนึ่งรายการหรือมากกว่ากับคอนโทรลเลอร์แต่ละตัวโปรดอย่าลังเลที่จะทำเช่นนั้น) นอกจากนี้คุณยังสามารถเพิ่มThreadpoolวัตถุเพื่อให้การดำเนินการแยกต่างหาก

บทบาทของmainในแอปพลิเคชันนี้อาจเป็น:

  1. สร้างDatabaseวัตถุ
  2. สร้างControllerวัตถุทั้งหมดและเชื่อมโยงกับDatabaseวัตถุ
  3. สร้างNetworkวัตถุและเชื่อมโยงControllerวัตถุทั้งหมดกับวัตถุ
  4. เริ่มการNetworkทำงานของวัตถุ (ซึ่งอาจเกี่ยวข้องกับการสร้างThreadpoolและการเดินสายเข้าไปในNetwork)

ขั้นตอนการตั้งค่าเหล่านี้สามารถระบุได้อย่างชัดเจนในmainหรือสามารถจัดการได้โดยวัตถุอื่น ๆ ตัวอย่างเช่นในแอปพลิเคชัน Spring ทั่วไปสิ่งที่mainฟังก์ชั่นทำคือสร้างบริบทแอปพลิเคชัน (วัตถุเดียว) สิ่งนี้ทริกเกอร์การสร้างและการเดินสายของวัตถุทั้งหมดที่กล่าวถึงในการกำหนดค่าสำหรับบริบทแอปพลิเคชันนั้น


1
ดูNewspeakตัวอย่างของภาษาที่ใช้เวลา OO ดังนั้นร้ายแรงที่สิ่งที่ต้องการmainวิธีการที่ไม่สามารถแม้แต่จะอยู่
Jörg W Mittag

1
คำตอบที่ดี แต่ถ้าฉันเป็นคุณฉันจะได้กล่าวถึงการฉีดพึ่งพา
Arseni Mourzenko

ฉันเห็นสิ่งที่คุณหมายถึงเกี่ยวกับรหัสของฉันไม่ได้เป็นเชิงวัตถุ ฉันไม่ได้สังเกต แต่ที่จริงแล้ววัตถุที่ฉันสร้างขึ้นไม่มีพฤติกรรมใด ๆ เพื่อที่จะทำให้มันเป็น "OO มากขึ้น" ความคิดอาจสร้างวัตถุอื่น ๆ ที่ "ใช้" สิ่งที่ฉันมีอยู่แล้ว แต่มันจะดีกว่าหรือที่จะไม่มีวัตถุทั้งหมดโดยไม่มีวิธีการ
Elia

@Elia - ไม่มันคงไม่ดีไปกว่านี้แล้ว มีค่าสำหรับการพิมพ์ข้อมูลที่มีโครงสร้างและตั้งชื่อ (เทียบกับการทิ้งไว้ในกMap) แต่ Java มีวิธีเดียวในการทำเช่นนี้ (เทียบกับ C ++ ซึ่งแตกต่างระหว่าง structs และคลาส) ดังนั้นกำหนดคลาสที่ไม่มีพฤติกรรมเพราะนั่นทำให้โปรแกรมของคุณง่ายต่อการเข้าใจ แต่รับรู้ว่าการทำเช่นนั้นไม่ทำให้โปรแกรมของคุณ "เชิงวัตถุ"
kdgregory

1

มันขึ้นอยู่กับ นำไปให้สุดขั้วสองอัน:

  1. mainวางสายรหัสโดยสายของคุณ ที่จะรวบรวมและเรียกใช้อย่างสวยงาม แต่สำหรับมนุษย์รหัสจะไม่สามารถย่อยได้
  2. เพียงแค่วางฟังก์ชั่นเดียว mainและเรียกว่าdoWhatNeedsToBeDoneและในที่สุดก็ยังคงอยู่ในประจำวันนี้ทางเดียวกัน ตอนนี้คุณมีความเรียบร้อยมากmainแต่แน่นอนคุณไม่ได้รับสิ่งที่ต้องทำ

ดังนั้นความจริงก็คือบางที่ในระหว่าง ลองสร้างmainที่เหมาะกับหน้าเดียวเพื่อให้ใครบางคนสามารถได้คำแนะนำหลักที่จำเป็นต้องดำเนินการ การได้รับพรมแดนที่ถูกต้องเป็นเพียงเรื่องของประสบการณ์

ข้างต้นเป็นกฎทั่วไปและนำไปใช้กับ OO เช่นเดียวกับการเขียนโปรแกรมการทำงาน


1

วิธีการหลักแบบคงที่มีอยู่เป็นการเปลี่ยนจากโลกที่ไม่ใช่วัตถุไปสู่โลกของวัตถุ มันทำมาตั้งแต่อย่างน้อย C ++ ในยุค 80

วิธีการแบบสแตติกเป็นหลักวิธีการที่ไม่เน้นวัตถุ: พวกเขาอาจเป็นวิธีการขั้นตอน; พวกเขาอาจเป็นวิธีการทำงาน ความคิดของวิธีการแบบคงที่เป็นหลักหนี OOP กับกระบวนทัศน์การเขียนโปรแกรมอื่น ๆ

Java, C # และ C ++ ทั้งหมดใช้สแตติกเมนต์เป็นการเปลี่ยนจากเมนเฟรมแบบดั้งเดิมเป็นภาษาการเขียนโปรแกรมตามลำดับซึ่งตอนนี้คุณสามารถเลือกใช้วัตถุ (หรือไม่) ตามต้องการ

ภาษาเหล่านี้อาจจำเป็นต้องใช้วัตถุอินสแตนซ์ลำดับแรกแทนแบบคงที่หลัก แต่เลือกวิธีแบบคงที่หลักแทน การใช้อินสแตนซ์วิธีทดแทนทางเลือกmainคลาสจะเป็นคลาสย่อยของthreadคลาสและภาษารันไทม์จะคิดในใจว่าอินสแตนซ์วัตถุเริ่มต้นของmainชั้นเรียนแล้วเรียกใช้runซ์เมธอดเมธอดอินสแตนซ์ของวิธีการเปิด / สร้างเธรดเพิ่มเติม

แต่ในอดีตมีการทำอย่างอื่นแทน: ในบางส่วนภาษาเหล่านี้เป็นเพียงการติดตามและบางส่วนเนื่องจากการทำเกลียวไม่ได้เป็นสิ่งที่มีความสำคัญในสมัยนั้นดังนั้นพวกเขาจึงใช้วิธีแบบคงที่ที่เรียบง่ายกว่า

นอกจากนี้วิธีการหลักแบบคงที่คือ "เรียบง่าย" ซึ่งคุณไม่ต้องใช้คลาสย่อยดังนั้นโปรแกรมการสอนแบบเล็กน้อยเช่นhello worldง่ายกว่าในบางแง่มุม (แต่พวกเขาใช้สิ่งที่อธิบายไม่ได้ค่อนข้างstaticยากที่จะอธิบายกับใครบางคนเมื่อคุณ พยายามสอน OOP ก่อน)


-1

มีการใช้วิธีการหลัก () เพื่อเรียกใช้โปรแกรม

ความรับผิดชอบ - เมื่อคุณเริ่มต้นใช้งานวิธีการหลัก () จะเรียกวิธีอื่น ๆ เพื่อเริ่มต้นใช้งานโปรแกรมของคุณ

นี่เป็นคำตอบง่ายๆที่ช่วยให้ฉันเข้าใจว่าความรับผิดชอบของวิธีการหลัก () คืออะไร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.