คำถามติดแท็ก project-structure

3
Folder-by-type หรือ Folder-by-feature
ฉันใช้ประโยชน์จากคู่มือสไตล์ AngularJS ภายในคู่มือนี้มีรูปแบบที่เรียกว่าfolder-by-featureแทนที่จะเป็นfolder-by-typeและฉันอยากรู้จริง ๆ แล้วว่าอะไรคือวิธีที่ดีที่สุด (ในตัวอย่างนี้สำหรับ Java) สมมติว่าฉันมีแอปพลิเคชันที่ฉันสามารถดึงผู้ใช้และสัตว์เลี้ยงโดยใช้บริการตัวควบคุมที่เก็บและวัตถุโดเมนของหลักสูตร ด้วยรูปแบบโฟลเดอร์โดย -..... เรามีสองตัวเลือกสำหรับโครงสร้างบรรจุภัณฑ์ของเรา: 1. โฟลเดอร์ตามประเภท com.example ├── domain │ ├── User.java │ └── Pet.java ├── controllers │ ├── UserController.java │ └── PetController.java ├── repositories │ ├── UserRepository.java │ └── PetRepository.java ├── services │ ├── UserService.java │ └── PetService.java │ // and everything …


3
เราควรเรียก Web API จากแอปพลิเคชัน MVC ในโซลูชันเดียวกันหรือไม่
ฉันกำลังทำงานในโครงการใน MVC ที่มีแอปพลิเคชันมือถือสิ่งหนึ่งที่ชัดเจนว่าเราต้องใช้ Web API เพื่อให้สามารถใช้ในแอปพลิเคชันมือถือได้ หลังจากสร้าง API เมื่อเราเริ่มพัฒนาเว็บไซต์เราสับสนและมีการอภิปรายว่าจะใช้ API หรือเข้าถึงวัตถุธุรกิจโดยตรง และเราก็จบลงหลังจากมีความคิดเห็นจากนักพัฒนาที่มีประสบการณ์มากขึ้นในการใช้ Web API แทนการใช้วัตถุธุรกิจโดยตรง ฉันมีความสับสนเกี่ยวกับโครงสร้างโซลูชันนี้ 1) เหตุใดเราจึงควรใช้ Web API และทำการร้องขอ HTTP (ซึ่งใช้เวลานาน) ในการรับหรือวางข้อมูลแทนที่จะเป็นออบเจ็กต์ธุรกิจโดยตรงซึ่งอยู่ในโซลูชันเดียวกัน 2) หลังจากมีข้อโต้แย้งพวกเขาบอกว่าถ้าลูกค้าต้องการโฮสต์ API และเว็บบนคลาวด์เซิร์ฟเวอร์ที่แตกต่างกันและใช้การปรับขนาดเฉพาะบน API หรืออาจต้องการให้มี URL ที่แตกต่างกันสำหรับการเข้าถึง API และเว็บ (ซึ่งเป็นตรรกะ) ดังนั้นในกรณีนั้นเราควรเรียก Web API จากแอปพลิเคชั่น MVC ในโซลูชันเดียวกันหรือไม่ 3) ถ้าเรากำลังโฮสต์ API และเว็บในการโฮสต์ที่แตกต่างกันนั่นหมายความว่าเว็บของเราจะใช้ WebClient และมีการโทร HTTP ในแต่ละการนำทาง ถูกต้องหรือไม่ …

5
วิธีการจัดโครงสร้างโครงการใน winform อย่างถูกต้อง?
เมื่อไม่นานมานี้ฉันเริ่มสร้างแอปพลิเคชั่น winform และในเวลานั้นมันมีขนาดเล็กและฉันก็ไม่ได้คิดว่าจะจัดโครงสร้างโครงการอย่างไร ตั้งแต่นั้นมาฉันเพิ่มคุณสมบัติเพิ่มเติมตามที่ต้องการและโฟลเดอร์โปรเจ็กต์ก็ใหญ่ขึ้นเรื่อย ๆ และตอนนี้ฉันคิดว่ามันถึงเวลาที่จะจัดโครงสร้างโครงการในบางด้าน แต่ฉันไม่แน่ใจว่าวิธีที่เหมาะสมคืออะไรดังนั้นฉันจึงมีคำถามสองสามข้อ วิธีการปรับโครงสร้างโฟลเดอร์โครงการอย่างเหมาะสม? ในขณะนี้ฉันกำลังนึกถึงบางสิ่งเช่นนี้: สร้างโฟลเดอร์สำหรับแบบฟอร์ม สร้างโฟลเดอร์สำหรับคลาสยูทิลิตี้ สร้างโฟลเดอร์สำหรับคลาสที่มีข้อมูลเท่านั้น หลักการตั้งชื่อคืออะไรเมื่อเพิ่มคลาส? ฉันควรเปลี่ยนชื่อคลาสเพื่อให้สามารถระบุฟังก์ชันการทำงานของพวกเขาได้โดยเพียงแค่ดูที่ชื่อของพวกเขา ยกตัวอย่างเช่นการเปลี่ยนชื่อทุกชั้นเรียนรูปแบบเพื่อให้พวกเขาจบลงด้วยชื่อในแบบฟอร์ม หรือไม่จำเป็นถ้ามีการสร้างโฟลเดอร์พิเศษสำหรับพวกมัน สิ่งที่ต้องทำเพื่อไม่ให้รหัสทั้งหมดสำหรับฟอร์มหลักสิ้นสุดลงใน Form1.cs ปัญหาอีกประการหนึ่งที่ฉันพบคือเมื่อฟอร์มหลักมีขนาดใหญ่ขึ้นตามคุณลักษณะที่ฉันเพิ่มแต่ละไฟล์รหัส (Form1.cs) เริ่มมีขนาดใหญ่มาก ฉันมีตัวอย่างเช่น TabControl และแต่ละแท็บมีพวงของการควบคุมและรหัสทั้งหมดลงเอยใน Form1.cs จะหลีกเลี่ยงสิ่งนี้ได้อย่างไร นอกจากนี้คุณรู้บทความหรือหนังสือที่จัดการกับปัญหาเหล่านี้หรือไม่

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

5
เป็นวิธีที่ดีที่สุดในการจัดการทดสอบหน่วยของเราคืออะไร
เราได้สร้างการทดสอบหน่วยจำนวนมากสำหรับโปรแกรมหลักของเราในช่วงหลายปีที่ผ่านมา หลายพัน ปัญหาคือเราไม่มีความคิดที่ชัดเจนว่าเราทดสอบอะไรเพราะมีมากมาย และนั่นเป็นปัญหาเพราะเราไม่รู้ว่าเราอ่อนแอในการทดสอบ (หรือที่เรามีการทำซ้ำ) แอพของเราเป็นเครื่องมือการรายงาน ดังนั้นคุณสามารถมีเทมเพลตที่ใช้ในการทดสอบการแยกวิเคราะห์ (เราอ่านคุณสมบัติของตารางทั้งหมด) ผสานข้อมูล (เราเก็บคุณสมบัติของตารางที่ถูกต้องในการผสาน) จัดรูปแบบหน้าสุดท้าย (เป็นตารางที่วางไว้อย่างถูกต้องบนหน้า ) และ / หรือรูปแบบเอาต์พุต (เป็นไฟล์ DOCX ที่สร้างขึ้นถูกต้อง) เพิ่มไปยังสิ่งที่เราต้องทดสอบ ใช้ช่องว่างรอบเซลล์ตาราง (เราใช้ Word, Excel, & PowerPoint สำหรับการออกแบบรายงาน) เราต้องทดสอบการขยายทั่วตัวแบ่งหน้าสำหรับตารางภายในเซลล์เซลล์ที่ผสานในแนวตั้งเซลล์ที่ถูกผสานในแนวนอนเซลล์ที่ผสานในแนวตั้งและแนวนอนที่มีตารางที่มีเซลล์ที่รวมในแนวตั้งและแนวนอนในตารางด้านใน พักข้ามหน้า ดังนั้นการทดสอบนั้นจะอยู่ในประเภทใด? การเสริมตาราง, ตัวแบ่งหน้า, เซลล์ที่ซ้อนกัน, เซลล์ที่ผสานในแนวตั้ง, เซลล์ที่รวมในแนวนอนหรืออย่างอื่น และเราจะจัดทำเอกสารประเภทเหล่านี้ตั้งชื่อการทดสอบหน่วย ฯลฯ อย่างไร? อัปเดต:ผู้คนจำนวนมากแนะนำให้ใช้เครื่องมือครอบคลุมเพื่อตรวจสอบว่าเรามีความครอบคลุมทั้งหมด น่าเสียดายที่มีการใช้งานอย่าง จำกัด ในกรณีของเราเนื่องจากข้อผิดพลาดมักเกิดจากชุดค่าผสมเฉพาะดังนั้นจึงเป็นรหัสที่ได้รับการทดสอบทั้งหมด แต่ไม่ใช่ในชุดค่าผสมนั้น ตัวอย่างเช่นเรามีลูกค้าเมื่อวานนี้ที่เริ่มบุ๊กมาร์ก Word ที่ส่วนท้ายของลูป forEach แต่ละรายการในเทมเพลต (เอกสาร Word) …

3
คำแนะนำโครงสร้างโครงการแอปพลิเคชันแบบชั้น MVVM, DDD และ WPF
ฉันกำลังพยายามตั้งค่าโครงสร้างแอปพลิเคชันของฉันใน VS และฉันต้องการ "ลอง" และพิสูจน์ในอนาคตให้อยู่ในระดับที่เหมาะสม แอปพลิเคชั่นนี้จะเป็น WPF เขียนใหม่ของแอป Winform เก่าที่ไม่ได้ทำตามอนุสัญญา ไม่มีเลเยอร์เทียร์คำย่อ ฯลฯ ... มันเป็นแอพพลิเคชั่นสำหรับองค์กรขนาดใหญ่พอสมควร ฉันวางแผนที่จะใช้ Linq To SQL เป็นฐานข้อมูลของฉันและมักจะเป็น MS SQL นอกจากนี้ฉันมีชุดทักษะที่มีอยู่กับมัน ฉันต้องการติดตาม MVVM และ DDD ที่ดีที่สุดที่ฉันสามารถทำได้ แต่ฉันสับสนในโครงสร้างของแอปพลิเคชันของฉันเมื่อรวมสิ่งเหล่านี้ ให้ฉันลองและอธิบายด้วยตัวอย่างบางส่วน เมื่อฉันติดตาม MVVM โครงสร้างโฟลเดอร์ของฉันอาจมีลักษณะเช่นนี้: Views Models ViewModels Helpers แต่วิธีที่เหมาะกับ DDD แบบเลเยอร์เรียบง่ายที่โครงสร้างโครงการของฉันอาจมีลักษณะเช่นนี้: MyApp.UI MyApp.Domain MyApp.Data ฉันจะใส่Modelsใน Domain layer หรือฉันมี 3 รุ่นว่าPerson? สิ่งนี้นำไปสู่คำถามอื่นที่ฉันจะวางที่เก็บและการแมปของวัตถุ DB …

2
คำแนะนำสำหรับไลบรารี GUI ใน Haskell [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน5 ปีที่ผ่านมา ในฐานะที่เป็นHaskell Wiki ระบุว่า : มีไลบรารี GUI จำนวนมากสำหรับ Haskell น่าเสียดายที่ไม่มีมาตรฐานใด ๆ เลยและทั้งหมดนั้นไม่สมบูรณ์ไม่มากก็น้อย โดยทั่วไปแล้วแผ่นไม้อัดระดับต่ำจะทำได้ดี แต่ก็มีระดับต่ำ abstractions ระดับสูงเป็นการทดลองที่ค่อนข้างดี ไม่จำเป็นต้องมีไลบรารี GUI ระดับกลางที่รองรับ อาจารย์ที่วิทยาลัยของฉันขอให้ฉันและวิชาเอกวิทยาการคอมพิวเตอร์อีกสามคนพิจารณาที่จะทำงานในห้องสมุด GUI สำหรับ Haskell ความคิดเริ่มต้นของเขาสำหรับโครงการคือการเขียนเลเยอร์บน OpenGL ที่เลียนแบบมอร์ฟิคไลบรารีที่พบใน Smalltalk ; อย่างไรก็ตามนี่เป็นเพียงข้อเสนอแนะและระบบอื่น ๆ ก็เป็นสิ่งที่ควรค่าแก่การพิจารณา นี่นำเราไปสู่คำถามที่เกิดขึ้นจริงและมีหลายส่วน ห้องสมุดของเรามุ่งมั่นในระดับใด Haskell Wiki ดูเหมือนจะบ่งบอกอย่างชัดเจนว่าต้องการ GUI ไลบรารีระดับกลาง อย่างไรก็ตามยินดีต้อนรับสู่ห้องสมุดระดับสูง ห้องสมุดของเราควรสร้างอะไร …

6
Business Logic Layer (BLL) ใช้อะไร?
ในการอ่านแนวปฏิบัติที่ดีสำหรับแอปพลิเคชันฐานข้อมูลฉันเจอผู้สนับสนุนที่เรียกว่า "เลเยอร์ตรรกะทางธุรกิจ" บ่อยครั้งและฉันพยายามตัดสินใจว่าควรใช้โครงการใดดีที่สุด (เป็นโครงการส่วนตัวขนาดเล็ก) ปัญหาของฉันอยู่ที่ข้อเท็จจริงที่ว่าฉันไม่สามารถคิดอะไรได้เลยสำหรับ BLL ที่จะทำเช่นนั้น DAL ไม่สามารถจัดการได้ (ดำเนินการแบบสอบถามและผลลัพธ์การจับคู่กับวัตถุ) ดังนั้น BLL ของฉันจึงเรียก DAL โดยไม่ทำอะไรเลย บางทีฉันผิดเกี่ยวกับสิ่งที่ DAL ควรทำเช่นกัน แต่ไม่ว่าจะมีฟังก์ชั่นอะไรบ้างที่คาดว่าน่าจะเป็น BLL ในแอพพลิเคชั่นการจัดการฐานข้อมูล?

5
สถาปัตยกรรม (โครงสร้าง) - มุ่งเน้นกับโครงสร้างโครงการที่มุ่งเน้นคุณสมบัติ
ฉันมีส่วนเกี่ยวข้องกับโครงการมีโครงสร้างไฟล์ / โฟลเดอร์ของโครงการที่มุ่งเน้นสถาปัตยกรรม: Root |____ Node1 |____ Event Handlers | |___ <all event handlers of project> |____ Events | |___ <all events of project> |____ Request Handlers | |___ <all request handlers of project> |____ Requests | |___ <all requests of project> |____ ... มันชัดเจนจากมุมมองทางสถาปัตยกรรมของระบบ (ได้รับการเสนอโดยทีมพัฒนา) มันเป็นโครงสร้างที่มุ่งเน้นคุณสมบัติที่ได้รับการเสนอโดยทีมนักออกแบบ: Root |____ Feature …

4
โครงการ C หลีกเลี่ยงความขัดแย้งในการตั้งชื่อ
ฉันกำลังดิ้นรนเพื่อหาคำแนะนำในโลกแห่งความเป็นจริงในทางปฏิบัติเกี่ยวกับการตั้งชื่อฟังก์ชั่นสำหรับโครงการห้องสมุดซีขนาดกลาง โครงการห้องสมุดของฉันถูกแยกออกเป็นสองสามโมดูลและ submodules ด้วยส่วนหัวของพวกเขาเองและตามสไตล์ OO (ฟังก์ชั่นทั้งหมดใช้โครงสร้างที่แน่นอนว่าเป็นอาร์กิวเมนต์แรกไม่มี globals ฯลฯ ) มันเป็นสิ่งที่เราชอบ: MyLib - Foo - foo.h - foo_internal.h - some_foo_action.c - another_foo_action.c - Baz - baz.h - some_baz_action.c - Bar - bar.h - bar_internal.h - some_bar_action.c โดยทั่วไปฟังก์ชั่นนั้นใหญ่เกินกว่าจะยกตัวอย่างเช่นsome_foo_actionและanother_foo_actionในfoo.cไฟล์การนำไปใช้งานทำให้ฟังก์ชั่นส่วนใหญ่คงที่และเรียกมันว่าวัน ฉันสามารถจัดการกับการลอกสัญลักษณ์ภายใน ("โมดูลส่วนตัว") เมื่อสร้างห้องสมุดเพื่อหลีกเลี่ยงความขัดแย้งสำหรับผู้ใช้ของฉันด้วยโปรแกรมไคลเอนต์ของพวกเขา แต่คำถามคือวิธีตั้งชื่อสัญลักษณ์ในห้องสมุดของฉัน? จนถึงตอนนี้ฉันได้ทำ: struct MyLibFoo; void MyLibFooSomeAction(MyLibFoo *foo, ...); struct MyLibBar; void …

6
แอพพลิเคชั่น JavaScript ขนาดใหญ่ควรมีโครงสร้างอย่างไร?
เมื่อเร็ว ๆ นี้ฉันได้แสดงปลั๊กอิน JavaScript บางรายการที่เขียนขึ้นสำหรับ OBIEE Mobile App Developer รวมถึงห้องสมุดที่กำหนดเองสำหรับโครงการต่างๆ มาจากพื้นหลังของ OOP ฉันสับสนเล็กน้อยเกี่ยวกับโครงสร้างของโครงการเหล่านี้ ฉันเห็นไฟล์ที่มีความยาวหลายพันบรรทัด ฉันคุ้นเคยกับการแยกสิ่งต่าง ๆ เป็นไฟล์และคลาส แต่ฉันเข้าใจว่านี่เป็นกรอบงานที่แตกต่างกัน - สำหรับขนาดไฟล์เป็นปัญหา - แต่ต้องมีวิธีที่ดีกว่าในการทำทั้งหมดหรือไม่ ความยาวของสคริปต์ไม่เพียงส่งผลต่อความสามารถในการอ่านและการบำรุงรักษา แต่ยังรวมถึงความเข้าใจโดยทั่วไปของบุคคลว่าโปรแกรมทำงานอย่างไร แอปพลิเคชันขนาดใหญ่มีโครงสร้างอย่างไร รูปแบบการออกแบบ OOP ทั่วไปสำหรับสิ่งนี้?

2
การแยกโปรเจ็กต์ java
ฉันมีโปรเจ็กต์ java ขนาดใหญ่และเราใช้ maven สำหรับวงรอบการสร้างของเรา โครงการนี้มีการใช้อย่างกว้างขวาง - ในโครงการอื่น ๆ ในแอปพลิเคชั่นต่าง ๆ ซึ่งบางส่วนอยู่ในนั้นและบางส่วนอยู่ที่อื่น ... พูดตามตรงแล้วมันเป็นระเบียบนิดหน่อย วัตถุประสงค์) และฉันต้องการทำความสะอาดสักหน่อย นอกจากนี้ยังไม่ผ่านการทดสอบอย่างสมบูรณ์ (มีการเพิ่มบิตจำนวนมากโดยไม่มีหน่วยที่เหมาะสมและการทดสอบการรวม) และมีการทดสอบบางอย่างที่ใช้เวลานานในการรันหรือไม่ผ่านจริง ... (uh-oh) - ดังนั้น การทดสอบจะถูกปิดในวงจรสร้าง maven (อีกครั้ง uh-oh) ฉันกำลังคิดที่จะแยกโครงการขนาดใหญ่นี้ออกเป็นโครงการขนาดเล็กโดยเฉพาะเช่นโครงการย่อย 'สุดท้าย' (หรือโครงการย่อยหลายโครงการ) จะรับโครงการย่อยต่าง ๆ ที่มันต้องการ ความคิดของฉันเป็นดังนี้: ถ้าฉันแยกโครงการใหญ่ออกเป็นโครงการย่อยต่าง ๆ นี่จะทำให้ชัดเจนว่าความรับผิดชอบของแต่ละโครงการคืออะไร โดยแยกเป็นโครงการย่อยฉันสามารถล้างการทดสอบของแต่ละโครงการย่อยทีละรายการและเปิดการทดสอบสำหรับโครงการย่อยนั้นในวงจรการสร้าง maven ฉันกังวลเล็กน้อยเกี่ยวกับผลกระทบที่อาจเกิดขึ้นกับเวลาสร้าง การวางโครงสร้างในโครงการขนาดใหญ่ (เช่นเป็นโครงการย่อยขนาดเล็ก) จะทำให้คอมไพเลอร์ช้าลงหรือไม่ นอกจากนี้ฉันมีข้อกังวลเล็กน้อยเกี่ยวกับผลกระทบที่อาจเกิดขึ้นกับการแก้ไขเวลาใน IDEs (เราใช้ Intellij เป็นหลัก) Intellij ดูเหมือนว่าจะสร้างแต่ละโครงการผ่านแผนผังการพึ่งพา …

1
การจัดระเบียบรหัสสำหรับการพัฒนาแอป iOS
ฉันได้พัฒนาแอพสำหรับแพลตฟอร์ม iOS และเมื่อฉันดำเนินการต่อไปฉันสังเกตเห็นว่าฉันทำงานหนักมากในการจัดระเบียบไฟล์ของฉัน (.h, .m, .mm) มีมาตรฐานอุตสาหกรรมหรือแนวปฏิบัติที่ดีที่สุดในเรื่องการจัดระเบียบไฟล์สำหรับโครงการ iOS หรือไม่? ไฟล์ของฉันมีคลาสที่กำหนดเอง (ด้านข้างตัวควบคุมมุมมอง), ตัวควบคุมมุมมองที่กำหนดเอง, เนื้อหาของบุคคลที่สาม, รหัสที่ใช้งานได้กับ iOS 5.0+ และรหัสที่ใช้กับเวอร์ชันก่อนหน้าเท่านั้น สิ่งที่ฉันกำลังมองหาคือทางออกสำหรับการจัดระเบียบสิ่งต่าง ๆ ในลักษณะที่คนอื่น ๆ (หรือตัวฉันเองในอีกไม่กี่ปีข้างหน้า) สามารถดูและเข้าใจโครงสร้างพื้นฐานของแอปพลิเคชันและไม่หลงทางในไฟล์หลายไฟล์ที่พบ

4
เมื่อพูดถึงการโฮสต์โปรเจ็กต์การทิ้งส่วนบุคคลหนึ่งบริการและโครงสร้างโปรเจ็กต์จะโดดเด่นหรือไม่? [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน4 ปีที่แล้ว ฉันกำลังดู Google Code, SourceForge, BitBucket และ GitHub เนื่องจากดูเหมือนว่าพวกเขาจะเป็นผู้เล่นรายใหญ่ ตอนนี้ฉันยังไม่ได้แยกคุณสมบัติทั้งหมดที่พวกเขามีให้ แต่ฉันกำลังมองหาที่ที่จะใส่รหัสต่าง ๆ ที่ฉันเขียน (โซลูชันของฉันสำหรับ Project Euler, รหัสที่ฉันอาจเขียนสำหรับ Code Golf / การเขียนโปรแกรม Puzzles Stack Exchange และอื่น ๆ ) ในตำแหน่งส่วนกลาง ดังนั้นคำถามแรกของฉันคือ: สำหรับสถานการณ์เช่นนี้บริการหนึ่งจะโดดเด่นในหมู่คนอื่น ๆ ? เมื่อฉันเลือกบริการแล้วฉันต้องเลือกวิธีที่ฉันจะแจกจ่ายรหัส มีตัวเลือกน้อยที่ฉันเห็นสำหรับการตั้งค่าที่เก็บและโครงการ ที่เก็บเดียวสามารถเก็บโปรเจ็กต์จำนวนมาก - ตัวอย่างเช่นฉันสามารถมีที่เก็บ "Project Euler Solutions" …

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