คำถามติดแท็ก coding-style

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

9
รูปแบบและคำแนะนำในการใส่รหัส
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Software Engineering Stack Exchange อพยพ 8 ปีที่ผ่านมา ฉันต้องการคำแนะนำและประสบการณ์ในการเขียนความคิดเห็นจากคุณ คุณจะเขียนพวกเขาในวิธีที่ง่ายที่สุดและให้ข้อมูลได้อย่างไร คุณมีนิสัยอย่างไรเมื่อแสดงความคิดเห็นบางส่วนของรหัส บางทีคำแนะนำที่แปลกใหม่? ฉันหวังว่าคำถามนี้จะรวบรวมคำแนะนำและคำแนะนำที่น่าสนใจที่สุดสิ่งที่มีประโยชน์ที่ทุกคนสามารถเรียนรู้ได้ ตกลงฉันจะเริ่ม โดยปกติแล้วฉันไม่ได้ใช้/* */ความคิดเห็นแม้ว่าฉันจะต้องแสดงความคิดเห็นหลายบรรทัด ข้อดี : รหัสจะดูดีกว่าเมื่อคุณผสมไวยากรณ์ดังกล่าวกับความคิดเห็นแบบบรรทัดเดียว IDEs ส่วนใหญ่มีความสามารถในการแสดงความคิดเห็นข้อความที่เลือกและพวกเขามักจะทำมันด้วยไวยากรณ์บรรทัดเดียว ข้อเสีย : ยากที่จะแก้ไขรหัสดังกล่าวโดยไม่ต้อง IDE วาง "จุด" ไว้ท้ายความคิดเห็นที่เสร็จแล้ว ตัวอย่างเช่น: //Recognize wallpaper style. Here I wanted to add additional details int style = int.Parse(styleValue); //Apply style to image. …

16
ตัวระบุสั้น ๆ ไม่ดีหรือไม่? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน6 ปีที่ผ่านมา ตัวระบุสั้น ๆ ไม่ดีหรือไม่? ความยาวของตัวระบุมีความสัมพันธ์กับความเข้าใจโค้ดอย่างไร ปัจจัยอื่นใด (นอกเหนือจากความเข้าใจโค้ด) อาจมีการพิจารณาเมื่อพูดถึงตัวระบุชื่อ เพื่อพยายามรักษาคุณภาพของคำตอบโปรดทราบว่ามีงานวิจัยบางอย่างเกี่ยวกับเรื่องนี้อยู่แล้ว! แก้ไข อยากรู้ว่าทุกคนไม่คิดว่าความยาวนั้นมีความเกี่ยวข้องหรือมีแนวโน้มที่จะชอบตัวระบุที่ใหญ่กว่าเมื่อลิงก์ทั้งสองที่ฉันระบุระบุว่าตัวระบุขนาดใหญ่เป็นอันตราย! ลิงค์เสีย ลิงค์ด้านล่างชี้ไปที่งานวิจัยเกี่ยวกับเรื่องนี้ แต่ตอนนี้มันพังฉันไม่ได้มีสำเนาของกระดาษไว้กับฉันและฉันจำไม่ได้ว่ามันคืออะไร ฉันจะทิ้งไว้ที่นี่ในกรณีที่มีคนคิดออก http://evergreen.loyola.edu/chm/www/Papers/SCP2009.pdf

7
แยกการคำนวณค่าส่งคืนและคำสั่งส่งคืนในวิธีเดียวหรือไม่
ฉันได้พูดคุยกับเพื่อนร่วมงานเกี่ยวกับการทำลายreturnคำสั่งและคำสั่งที่คำนวณค่าส่งคืนในสองบรรทัด ตัวอย่างเช่น private string GetFormattedValue() { var formattedString = format != null ? string.Format(format, value) : value.ToString(); return formattedString; } แทน private string GetFormattedValue() { return format != null ? string.Format(format, value) : value.ToString(); } รหัสฉลาดฉันไม่เห็นคุณค่าในตัวแปรแรก สำหรับฉันหลังมีความชัดเจนโดยเฉพาะอย่างยิ่งสำหรับวิธีการที่สั้น ข้อโต้แย้งของเขาไม่ว่าอะไรก็ตามที่ตัวแปรในอดีตนั้นง่ายต่อการตรวจแก้จุดบกพร่อง - ซึ่งค่อนข้างจะเป็นข้อดีเล็กน้อยเนื่องจาก VisualStudio ช่วยให้เราสามารถตรวจสอบข้อความได้อย่างละเอียดมากเมื่อการดำเนินการหยุดลงเนื่องจากจุดแตกหัก คำถามของฉันคือถ้ามันยังคงเป็นจุดที่ถูกต้องในการเขียนรหัสที่ชัดเจนน้อยลงเพียงเพื่อให้การดีบักการเหลือบง่ายขึ้น? มีข้อโต้แย้งเพิ่มเติมสำหรับตัวแปรที่มีการคำนวณแยกและreturnคำสั่งหรือไม่

11
การบำรุงรักษาอย่างชาญฉลาดมีอีกอย่างหนึ่งที่ไม่ต้องใช้เครื่องมือจัดฟันที่ปลอดภัยหรือไม่?
คือelse whileโดยไม่แทรกแซงการพิจารณาการจัดฟัน "ปลอดภัย" การบำรุงรักษาที่ชาญฉลาด? กำลังเขียนif-elseโค้ดโดยไม่มีเครื่องหมายวงเล็บด้านล่าง ... if (blah) foo(); else bar(); ... มีความเสี่ยงเนื่องจากการขาดเครื่องหมายปีกกาทำให้ง่ายต่อการเปลี่ยนความหมายของรหัสโดยไม่ตั้งใจ อย่างไรก็ตามด้านล่างมีความเสี่ยงหรือไม่ if (blah) { ... } else while (!bloop()) { bar(); } หรือelse whileโดยไม่ต้องจัดฟันจัดฟันถือว่า "ปลอดภัย"?

7
ระบุชื่อพารามิเตอร์ทางเลือกแม้ว่าจะไม่จำเป็นก็ตาม?
พิจารณาวิธีการต่อไปนี้: public List<Guid> ReturnEmployeeIds(bool includeManagement = false) { } และสายต่อไปนี้: var ids = ReturnEmployeeIds(true); สำหรับนักพัฒนาใหม่สำหรับระบบมันค่อนข้างยากที่จะคาดเดาสิ่งที่trueทำ สิ่งแรกที่คุณต้องทำคือวางเม้าส์เหนือชื่อเมธอดหรือไปที่คำจำกัดความ (ซึ่งไม่ได้เป็นงานใหญ่เลยแม้แต่น้อย) แต่เพื่อประโยชน์ในการอ่านมันทำให้รู้สึกถึงการเขียน: var ids = ReturnEmployeeIds(includeManagement: true); มีที่ไหนที่อย่างเป็นทางการกล่าวถึงว่าจะระบุพารามิเตอร์ทางเลือกอย่างชัดเจนหรือไม่เมื่อคอมไพเลอร์ไม่ต้องการให้คุณ? บทความต่อไปนี้กล่าวถึงข้อตกลงการเข้ารหัสบางอย่าง: https://msdn.microsoft.com/en-gb/library/ff926074.aspx สิ่งที่คล้ายกับบทความข้างต้นจะดีมาก

5
เหตุใดการเขียนบางสิ่งในภาษา X จึงไม่ดีราวกับว่าคุณกำลังเขียนโปรแกรมในภาษา Y ในแง่ของการใช้กระบวนทัศน์การเข้ารหัสที่ใช้ร่วมกัน [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ไม่นานมานี้ฉันถามคำถามเกี่ยวกับ SO เกี่ยวกับสิ่งที่เขียนใน C ++ แต่แทนที่จะได้รับคำตอบสำหรับปัญหาที่เกิดขึ้นความคิดเห็นต่าง ๆ ก็บ้าไปตามสไตล์การเขียนโค้ดของฉันแม้ว่าฉันจะระบุว่ามันเป็นรหัสWIPและฉันตั้งใจจะล้างมันในภายหลังเมื่อฉันใช้เคสพื้นฐาน (ฉันได้รับคะแนนเสียงลงมากที่ฉันตัดสินใจที่จะดึงคำถามเนื่องจากตัวแทนของฉันดังนั้นแล้วอยู่ใกล้สุดซึ้ง) มันทำให้ฉันสงสัยว่าทำไมผู้คนถึงยอมรับทัศนคติที่ว่า "คุณเป็นโนบ ฉันถูกกล่าวหาว่าเขียน C ++ เหมือนกับว่าเป็น Java สิ่งที่ฉันไม่เข้าใจและยังทำให้ฉันงุนงง ฉันได้รับการเขียนโปรแกรมในภาษา OOP ไม่กี่ปีที่ผ่านมาในขณะนี้แม้ในช่วงเวลา ฉันเลือกภาษาที่จะใช้ในแง่ของไลบรารีที่มีอยู่และสภาพแวดล้อมการดำเนินการที่ดีที่สุดสำหรับงานในมือ ฉันนำรูปแบบการออกแบบมาใช้ในรหัส OOP และฉันค่อนข้างมั่นใจว่าการใช้รูปแบบของฉันนั้นฟังดูดีและ OO ที่ชาญฉลาดฉันสามารถมีรูปแบบของตัวเองได้ ฉันเข้าใจกล่องเครื่องมือของ OOP แต่เลือกที่จะใช้เครื่องมือเฉพาะเมื่อฉันคิดว่าเป็นสิ่งจำเป็นจริงๆไม่ใช่เพื่อใช้เคล็ดลับที่ประณีตเพื่อแสดงการเข้ารหัสของฉัน (ซึ่งฉันรู้ว่าไม่ใช่รอยบนสุด แต่ฉันคิดว่าไม่อยู่ในระดับ n00b เช่นกัน) ฉันออกแบบรหัสของฉันก่อนที่ฉันจะเขียนบรรทัดเดียว ในการกำหนดการทดสอบฉันทำรายการเป้าหมายของชั้นเรียนหนึ่ง ๆ และเกณฑ์การทดสอบที่ต้องปฏิบัติตาม เพราะฉันจะสร้างไดอะแกรมลำดับและเขียนรหัสได้ง่ายขึ้นฉันเลือกที่จะเขียนการทดสอบหลังจากที่อินเทอร์เฟซกลายเป็นที่ชัดเจน ฉันต้องยอมรับว่าในส่วนของรหัสที่ฉันโพสต์ในคำถามฉันยังคงใช้พอยน์เตอร์แทนการใช้สมาร์ทพอยน์เตอร์ ฉันใช้ RAII ทุกครั้งที่ทำได้ ฉันรู้ว่า …

5
มีการศึกษาหลักการสไตล์การเข้ารหัสอย่างเข้มงวดทางวิทยาศาสตร์หรือไม่? [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัพเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการ4 ปีที่แล้ว หลักการสไตล์การเข้ารหัส - เช่นเดียวกับหลักการทางออกเดียว - เป็นสิ่งที่ดีจริงเหรอ? เสมอหรือบางครั้ง มันแตกต่างกันมากแค่ไหน? ไม่ว่าความคิดเห็นของคุณจะเป็นคำถามแบบอัตนัย หรือว่าพวกเขา? มีใครพยายามที่จะทำให้วัตถุประสงค์การศึกษาหลักการสไตล์การเข้ารหัสอย่างเข้มงวดทางวิทยาศาสตร์หรือไม่? ฉันไม่สามารถจินตนาการได้ว่าทุกคนจะทำการศึกษาแบบ double-blind ของความสามารถในการอ่านได้ แต่อาจเป็นไปได้ที่จะไม่รู้ตัว - ใช้นักเรียนที่ไม่รู้เกี่ยวกับหลักการที่ถูกศึกษาเป็นวิชาและผู้ที่ไม่ใช่โปรแกรมเมอร์

5
ใน Java ผู้ช่วยส่วนตัวควรไปด้านบนหรือด้านล่างวิธีสาธารณะ? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ฉันสังเกตเห็นว่าผู้ร่วมงานกับฉันมีแนวปฏิบัติที่ตรงกันข้ามเกี่ยวกับการเรียงลำดับวิธีการในคลาส Java ของเรา หนึ่งในเราเริ่มเรียนด้วยวิธีการสาธารณะที่สำคัญแล้วให้ผู้ช่วยส่วนตัวทั้งหมดหลังจากนั้น อีกคนหนึ่งของเราทำให้แน่ใจว่าวิธีการสาธารณะเป็นจุดสิ้นสุด เห็นได้ชัดว่านี่เป็นเพียงปัญหาสไตล์และไม่มีคำตอบที่ถูกต้อง อย่างไรก็ตามก่อนที่เราจะตัดสินใจว่าเรื่องนี้เป็นอีกการต่อสู้ของ Yooks vs Zooks และเลือกอย่างใดอย่างหนึ่งโดยพลการฉันสงสัยว่าบางทีอาจจะมีคำแนะนำสไตล์ Java มาตรฐานหรือเหตุผลบางประการที่ทำไมวิธีหนึ่งดีกว่าวิธีอื่น

6
ความสามารถในการอ่านเป็นเหตุผลที่ถูกต้องหรือไม่ที่จะไม่ใช้พารามิเตอร์ const in (การอ้างอิง)
เมื่อเขียนฟังก์ชั่นบางอย่างฉันพบคำสำคัญ const ในพารามิเตอร์ดังนี้: void MyClass::myFunction(const MyObject& obj,const string& s1,const string& s2,const string& s3){ } มักทำให้เกิดการแบ่งบรรทัดออกเป็น 2 บรรทัดใน IDE หรือ vim ดังนั้นฉันต้องการลบคำหลัก const ทั้งหมดในพารามิเตอร์: void MyClass::myFunction(MyObject& obj,string& s1,string& s2,string& s3){ } นั่นเป็นเหตุผลที่ถูกต้องหรือไม่ที่จะไม่ใช้ const? มันสามารถบำรุงรักษาเพื่อให้วัตถุพารามิเตอร์ไม่เปลี่ยนแปลงด้วยตนเอง?

7
“ ตัวอย่างโค้ด” ของฉันควรเป็นอย่างไร [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัพเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการ4 ปีที่แล้ว ฉันเพิ่งได้รับการสัมภาษณ์ทางโทรศัพท์ที่ดี (สำหรับตำแหน่งที่เกี่ยวข้องกับ CakePHP ไม่ใช่ว่ามันสำคัญกับคำถาม) ผู้สัมภาษณ์ดูเหมือนจะประทับใจกับประวัติการทำงานและบุคลิกภาพของฉัน ในตอนท้ายแม้ว่าเขาขอให้ฉันส่งอีเมลตัวอย่างโค้ดให้เขาจากโครงการทำงานที่มีอยู่ของฉัน "เพื่อตรวจสอบว่าคุณไม่ได้เป็นโปรแกรมเมอร์ที่แย่มากเลยฮ่า ๆ !" ฉันไม่กังวลเกินไปที่รหัสของฉันไม่สามารถยืนอยู่บนสองเท้าของตัวเองได้ แต่ฉันเป็นโปรแกรมเมอร์ระดับกลางมากกว่าเป็นผู้เชี่ยวชาญ มีข้อผิดพลาดอะไรที่ชัดเจนที่ฉันควรตรวจสอบให้แน่ใจว่าตัวอย่างโค้ดของฉันไม่ตกหล่นในกรณีที่พวกเขาออกกฎฉันทันที ประการที่สองและนี่อาจเป็นส่วนที่ยากขึ้นของคำถามที่จะตอบคำถามคุณลักษณะใดในตัวอย่างโค้ดที่น่าประทับใจมากที่พวกเขาจะทำให้คุณมีแนวโน้มที่จะชอบโปรแกรมเมอร์มากขึ้น ยินดีต้อนรับความคิดหรือคำแนะนำทั้งหมด!

6
ควรกำหนดค่าคงที่สตริงถ้าจะใช้เพียงครั้งเดียวหรือไม่
เรากำลังใช้งานอะแดปเตอร์สำหรับ Jaxen (ไลบรารี XPath สำหรับ Java) ที่ช่วยให้เราใช้ XPath เพื่อเข้าถึงโมเดลข้อมูลของแอปพลิเคชันของเรา สิ่งนี้ทำได้โดยการใช้คลาสที่จับคู่สตริง (ส่งถึงเราจาก Jaxen) ไปยังองค์ประกอบของโมเดลข้อมูลของเรา เราประเมินว่าเราต้องการประมาณ 100 คลาสโดยมีการเปรียบเทียบสตริงมากกว่า 1,000 รายการ ฉันคิดว่าวิธีที่ดีที่สุดในการทำเช่นนี้คือง่ายถ้าคำสั่ง / else พร้อมสตริงที่เขียนลงในโค้ดโดยตรงแทนที่จะกำหนดแต่ละสตริงเป็นค่าคงที่ ตัวอย่างเช่น: public Object getNode(String name) { if ("name".equals(name)) { return contact.getFullName(); } else if ("title".equals(name)) { return contact.getTitle(); } else if ("first_name".equals(name)) { return contact.getFirstName(); } else if …

8
ข้อห้ามในการใช้ลูปภายในลูปคืออะไร
แค่สงสัย. สิ่งที่ฉันเคยมีมากที่สุดคือสำหรับวงในสำหรับวงเนื่องจากหลังจากอ่านบทความนี้จากLinus Torvalds: แท็บคือ 8 ตัวอักษรและทำให้การเยื้องเป็น 8 ตัวอักษร มีการเคลื่อนไหวนอกรีตที่พยายามทำการเยื้อง 4 (หรือแม้แต่ 2!) ตัวละครที่ลึกและคล้ายกับการพยายามกำหนดค่าของ PI ให้เป็น 3 เหตุผล: แนวคิดทั้งหมดที่อยู่เบื้องหลังการเยื้องคือการกำหนดที่บล็อกของการควบคุมเริ่มต้นและสิ้นสุดอย่างชัดเจน โดยเฉพาะอย่างยิ่งเมื่อคุณดูหน้าจอเป็นเวลา 20 ชั่วโมงติดต่อกันคุณจะพบว่าการเยื้องนั้นง่ายกว่ามากหากคุณมีการเยื้องขนาดใหญ่ ตอนนี้บางคนจะอ้างว่าการมีการเยื้องตัวอักษร 8 ตัวทำให้โค้ดเคลื่อนที่ไปทางขวาจนเกินไปและทำให้อ่านได้ยากบนหน้าจอเทอร์มินัล 80 ตัว คำตอบก็คือหากคุณต้องการการเยื้องมากกว่า 3 ระดับคุณจะถูกเกลียวอยู่แล้วและควรแก้ไขโปรแกรมของคุณ https://www.kernel.org/doc/Documentation/CodingStyle ฉันคิดว่ามันเป็นวิธีปฏิบัติที่ยอมรับไม่ได้สำหรับฉันที่จะไปที่เลเยอร์ที่สามของการวนซ้ำและจะปรับโครงสร้างรหัสของฉัน (เบื้องต้น Qt) Linus พูดเล่นหรือเปล่า มันขึ้นอยู่กับภาษาหรือแอพพลิเคชั่นหรือไม่? มีบางสิ่งที่จำเป็นต้องวนซ้ำอย่างน้อยสามระดับหรือไม่

2
เป็นความคิดที่ดีหรือไม่ที่จะให้ลายเซ็นฟังก์ชันที่แตกต่างกันซึ่งทำสิ่งเดียวกัน
นี่คือคลาส C ++ ที่สร้างขึ้นด้วยค่าสามค่า class Foo{ //Constructor Foo(std::string, int, char); private: std::string foo; char bar; int baz; }; ชนิดพารามิเตอร์ทั้งหมดแตกต่างกัน ฉันสามารถสร้างคอนสตรัคเตอร์มากเกินไปเพื่อให้ลำดับนั้นไม่สำคัญ class Foo{ //Constructors Foo(std::string, char, int); Foo(std::string, int, char); Foo(char, int, std::string); Foo(char, std::string, int); Foo(int, std::string, char); Foo(int, char, std::string); private: std::string foo; char bar; int baz; }; แต่นั่นเป็นความคิดที่ดี? …

7
ไกลแค่ไหนที่ 'var' และตัวดำเนินการรวมตัวกันเป็นโมฆะ '??' ได้รับความบันเทิงโดยไม่ขัดขวางการอ่านหรือไม่
คำถามนี้ถูกโยกย้ายจาก Code Exchange Stack Stack เพราะสามารถตอบได้ใน Software Engineering Stack Exchange อพยพ 8 ปีที่ผ่านมา ฉันรู้ว่าชื่อของคำถามนั้นเป็นอัตนัยมาก แต่ฉันก็ต้องเผชิญกับการใช้งาน??โอเปอร์เรเตอร์โดยเพื่อนร่วมงานของฉันซึ่งในเวลาเดียวกันฉันก็ไม่ค่อยมีความสุข / สบายใจที่ได้ใช้varโค้ดใหม่ที่กำลังมาถึง อาร์กิวเมนต์ที่ให้สำหรับการใช้??โอเปอเรเตอร์คือมันสามารถอ่านค่าได้ในโค้ด คำถามของฉันคือสิ่งที่เกิดขึ้นไม่เหมือนกันเมื่อคุณเริ่มใช้var?

12
ฟังก์ชั่นแบบยาวยอมรับได้หรือไม่หากมีโครงสร้างภายใน
เมื่อจัดการกับอัลกอริทึมที่ซับซ้อนในภาษาที่รองรับฟังก์ชันซ้อนกัน (เช่น Python และ D) ฉันมักจะเขียนฟังก์ชั่นขนาดใหญ่ (เพราะอัลกอริทึมมีความซับซ้อน) แต่ลดขนาดลงโดยใช้ฟังก์ชันซ้อนเพื่อสร้างโค้ดที่ซับซ้อน ฟังก์ชั่นขนาดใหญ่ (100+ บรรทัด) ยังถือว่าเป็นความชั่วแม้ว่าจะมีโครงสร้างที่ดีภายในผ่านการใช้ฟังก์ชั่นที่ซ้อนกันอยู่หรือไม่? แก้ไข: สำหรับผู้ที่คุณไม่คุ้นเคยกับ Python หรือ D ฟังก์ชั่นที่ซ้อนกันในภาษาเหล่านี้ยังอนุญาตการเข้าถึงขอบเขตฟังก์ชั่นด้านนอก ใน D การเข้าถึงนี้ช่วยให้การกลายพันธุ์ของตัวแปรในขอบเขตด้านนอก ใน Python อนุญาตให้อ่านได้เท่านั้น ใน D staticคุณสามารถปิดการเข้าถึงอย่างชัดเจนขอบเขตด้านนอกในฟังก์ชั่นที่ซ้อนกันโดยประกาศว่า

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