การใช้งานของสมาคมการรวมและองค์ประกอบคืออะไร?


20

ฉันได้ผ่านทฤษฏีมากมายเกี่ยวกับการห่อหุ้มและเทคนิคสามประการของการนำไปใช้ซึ่ง ได้แก่ Association, Aggregation and Composition

สิ่งที่ฉันพบคือ :

encapsulation

Encapsulation เป็นเทคนิคในการสร้างฟิลด์ในคลาสส่วนตัวและให้การเข้าถึงฟิลด์ด้วยวิธีสาธารณะ หากมีการประกาศเขตข้อมูลส่วนบุคคลจะไม่สามารถเข้าถึงได้โดยทุกคนที่อยู่นอกชั้นเรียนดังนั้นจึงซ่อนเขตข้อมูลภายในชั้นเรียน ด้วยเหตุนี้การห่อหุ้มจึงถูกเรียกว่าการซ่อนข้อมูล

การห่อหุ้มสามารถอธิบายได้ว่าเป็นเกราะป้องกันที่ป้องกันรหัสและข้อมูลที่ถูกเข้าถึงแบบสุ่มโดยรหัสอื่นที่กำหนดไว้นอกคลาส การเข้าถึงข้อมูลและรหัสถูกควบคุมอย่างแน่นหนาโดยอินเตอร์เฟส

ประโยชน์หลักของการห่อหุ้มคือความสามารถในการปรับเปลี่ยนรหัสที่เรานำไปใช้โดยไม่ทำลายรหัสของผู้อื่นที่ใช้รหัสของเรา ด้วยคุณสมบัตินี้ Encapsulation ช่วยให้การบำรุงรักษาความยืดหยุ่นและความสามารถในการขยายโค้ดของเรา

สมาคม

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

การรวมตัว

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

ส่วนประกอบ

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

คำถามคือ:

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


1
โปรดทราบว่าการรวมองค์ประกอบและสมาคมไม่ใช่เทคนิคในการใช้การห่อหุ้ม การห่อหุ้มสามารถมีอยู่แม้ว่าจะมีเพียงคลาส / วัตถุเดียว Encapsulation เป็นเพียงคุณสมบัติที่สำคัญใน Object Orientation เพื่อซ่อนข้อมูลของวัตถุของคุณ
Maxood

1
"อาจารย์คนเดียวไม่สามารถอยู่ในหลายแผนกได้จริงเหรอ? คุณไม่สังเกตเห็นว่าทรัพยากรของคุณแก้ไขเนื้อหาหรือไม่
KNU

ฉันจัดการใช้ Composition เพื่อระบุ DDD Agotsate Roots และเอนทิตีของพวกเขาเมื่อทำการออกแบบด้วยโดเมน การใช้งานใหม่สำหรับการประชุมเก่า
Jonn

คำตอบ:


12

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

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

นี่คือตัวอย่างของการห่อหุ้ม

public class Counter {
    private int n = 0;
    public int inc() { return n++; }
}

หรือใช้ฟังก์ชั่นแลมบ์ดาเดียวกัน

var counter = (function() {
    var n = 0;
    var inc = function() { return n++; }
    return inc;
})();

ในทั้งสองกรณีข้อมูลนั่นคือตัวแปรnจะถูกรวมเข้ากับฟังก์ชันincที่ทำงานกับมัน และไม่มีทางที่ฟังก์ชั่นอื่น ๆ จะสามารถเข้าถึงnได้ดังนั้นเราจึงมีโมดูลห่อหุ้มที่ให้การนับเป็นบริการ

หมายเหตุ: การเปิดเผยสถานะภายในของวัตถุทั้งหมดผ่าน accessors เป็นการละเมิด encapsulation อนิจจาเป็นเรื่องธรรมดาที่หลายคนจะสร้างความสับสนด้วยการออกแบบเชิงวัตถุที่ดี


2
การจัดการหน่วยความจำอัตโนมัติไม่มีส่วนเกี่ยวข้องกับความสัมพันธ์ของวัตถุ แผนภาพวัตถุเองบอกโปรแกรมเมอร์ถึงวิธีการเขียนรหัสคลาสอินเทอร์เฟซและวิธีการตามความต้องการของระบบภายใต้การพิจารณา
Maxood

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

8

Encapsulation เป็นเทคนิคในการสร้างฟิลด์ในคลาสส่วนตัวและให้การเข้าถึงฟิลด์ด้วยวิธีสาธารณะ หากมีการประกาศเขตข้อมูลส่วนบุคคลจะไม่สามารถเข้าถึงได้โดยทุกคนที่อยู่นอกชั้นเรียนดังนั้นจึงซ่อนเขตข้อมูลภายในชั้นเรียน ด้วยเหตุนี้การห่อหุ้มจึงถูกเรียกว่าการซ่อนข้อมูล

    public class Test{

    private String name;

       private int age;

       public int getAge(){
          return age;
       }

       public String getName(){
          return name;
       }
    }

ดูคำถามนี้ด้วย

การเชื่อมโยงบ่งชี้ความสัมพันธ์ระหว่างวัตถุ เช่นคอมพิวเตอร์ใช้แป้นพิมพ์เป็นอุปกรณ์ป้อนข้อมูล

การเชื่อมโยงจะถูกใช้เมื่อวัตถุหนึ่งต้องการวัตถุอื่นเพื่อให้บริการ

การรวมเป็นกรณีพิเศษของการรวมกลุ่ม การเชื่อมโยงทิศทางระหว่างวัตถุ เมื่อวัตถุ 'มี -' วัตถุอื่นแล้วคุณมีการรวมระหว่างพวกเขา

เช่น: ห้องมีโต๊ะ แต่โต๊ะสามารถอยู่ได้โดยไม่มีห้อง

    class Room {

      private Table table;

      void setTable(Table table) {
        this.table = table;
      }

    }

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

    class House {

      private  Room room;

      House(Room roomSpecs) {
        room = new Room(roomSpecs);
      }

    }

Composition เป็นเทคนิคการออกแบบเพื่อสร้างความสัมพันธ์แบบ has-a ในคลาสไม่ว่าจะโดย Inheritance หรือ Object Composition เพื่อนำโค้ดกลับมาใช้ใหม่

หนึ่งในแนวปฏิบัติที่ดีที่สุดในการเขียนโปรแกรม Java คือการใช้การแต่งเพลงมากกว่าการสืบทอด


คำถามนี้ถามคำถามนี้อย่างไร
ริ้น

1

การใช้เทคนิคเหล่านั้นมักจะส่งผลในการออกแบบเช่นSOLIDหรือต่าง ๆรูปแบบการออกแบบ

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


1

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

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

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

Encapsulationเป็นหนึ่งในเสาหลักของการออกแบบเชิงวัตถุ คุณต้องรวมข้อมูลของคุณและการดำเนินการที่คุณจะดำเนินการกับข้อมูลของคุณ นอกจากนี้คุณยังต้องซ่อนคุณลักษณะบางอย่างของวัตถุของคุณจากโลกภายนอกเพื่อให้วัตถุนั้นอยู่รอดในสถานะที่ถูกต้อง เมื่อวัตถุ 2 ชิ้นโต้ตอบกันพวกมันจะต้องโต้ตอบกันผ่านทางอินเตอร์เฟส และนั่นคือสิ่งที่ encapsulation ช่วยให้มั่นใจได้เมื่อเราออกแบบระบบ OO ของเรา

นี่คือวิธีนำแนวคิดเหล่านี้ไปใช้กับรหัส:

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

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

class House{
          string _HouseType;   
     public:    
    void setHouseType(string house_type)
     {
        this. _HouseType = house_type;
     } 

     string getHouseType()
    {
       return _HouseType;
    }
};



 House HouseObject = new House();


class Room{

 public: 
 Room(string HouseType) {
       this._HouseType = HouseObject.getHouseType();  //as in my system a room cannot exist without a house

 } 

};

โปรแกรมเมอร์จะตรวจสอบให้แน่ใจในขณะที่เรียกใช้destructorsของวัตถุที่ destuctor ของวัตถุอื่นก็จะถูกเรียกใช้เช่นกัน นี่เป็นสิ่งสำคัญ

การรวมกัน: ช่วยบอกว่าถ้าความสัมพันธ์ระหว่างออบเจ็กต์อ่อนแอแล้วเราสำหรับโปรแกรมเมอร์มันจะหมายถึงการใช้ตัวแปรอินสแตนซ์แทนเพื่อระบุความสัมพันธ์ จากนั้นเขียน mutator functon (setter) เพื่อให้คุณค่ากับวัตถุนั้นจากอีกอันหนึ่ง

class Department{

 string dept_name;

public:
   void setDeptName(string name)
   {
        this.dept_name=name;
   }

   string getDeptName()
   {
        return dept_name; 
   }

};



 Department DepartmentObject = new Department();

class Teacher{

 string dept_name;

public:

  setDeptName(string name)
  {
     this.dept_name = DepartmentObject.getDeptName();  //You only need to invoje this method when needed (aggregation)
  }
}

};

1

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

encapsulation

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

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

สมาคม

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

บรรจุ

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

การรวมตัว

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

ส่วนประกอบ

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

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

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