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

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

9
ใช้คำหลักเข้าร่วมหรือไม่
แบบสอบถาม SQL ต่อไปนี้เหมือนกัน: SELECT column1, column2 FROM table1, table2 WHERE table1.id = table2.id; SELECT column1, column2 FROM table1 JOIN table2 ON table1.id = table2.id; และแน่นอนส่งผลให้มีแผนแบบสอบถามเดียวกันในทุก DBMS ที่ฉันเคยลอง แต่บ่อยครั้งที่ฉันอ่านหรือฟังความคิดเห็นที่หนึ่งดีกว่าอีกแน่นอน ตามธรรมชาติแล้วคำกล่าวอ้างเหล่านี้จะไม่ได้รับการยืนยัน ที่ที่ฉันทำงานรุ่นที่สองดูเหมือนจะเป็นที่ชื่นชอบของนักพัฒนาส่วนใหญ่คนอื่น ๆ และฉันก็เลยชอบสไตล์นั้นเพื่อลดความประหลาดใจ แต่ในใจของฉันฉันกำลังคิดถึงคนแรก (เพราะนั่นคือวิธีที่ฉันเรียนรู้มาตั้งแต่แรก) หนึ่งในรูปแบบเหล่านี้ดีกว่าที่อื่นอย่างมีวัตถุประสงค์ ถ้าไม่มีเหตุผลใดที่จะใช้อีกแบบหนึ่ง
45 sql  coding-style 

12
การสะกดผิดโดยเจตนาเพื่อหลีกเลี่ยงคำที่สงวนไว้
ฉันมักจะเห็นรหัสที่มีการสะกดผิดโดยเจตนาของคำทั่วไปที่ดีขึ้นหรือแย่ลงกลายเป็นคำสงวน: klassหรือclazzสำหรับชั้นเรียน :Class clazz = ThisClass.class kountสำหรับการนับใน SQL:count(*) AS kount โดยส่วนตัวแล้วฉันพบว่าการอ่านนี้ลดลง ในทางปฏิบัติของฉันเองฉันไม่ได้พบมากเกินไปกรณีที่ชื่อที่ดีกว่าอาจจะไม่ได้ถูกนำมาใช้ - หรือitemClassrecordTotal ตัวอย่างจาก JavaDocs สำหรับClassแสดงสิ่งนี้ในพารามิเตอร์: public <U> Class<? extends U> asSubclass(Class<U> clazz) นี่แสดงให้เห็นถึงกรณีการใช้งานที่สมเหตุสมผลหรือไม่?

3
รูปแบบการเข้ารหัสสำหรับโปรแกรมเมอร์ที่บกพร่องทางสายตา [ปิด]
ฉันมีความบกพร่องทางสายตา ฉันเห็นแว่นตาดีพอที่จะขับรถ แต่ขนาดตัวอักษรฉันทำงานได้อย่างสบายใจฉันสามารถดูได้ครั้งละประมาณ 15 บรรทัดจาก 100 ตัวอักษร สิ่งนี้ส่งผลต่อสไตล์การเขียนโค้ดของฉัน สิ่งหนึ่งที่ฉันทำคือเขียนฟังก์ชั่นที่สั้นลง รหัสของฉันมีแนวโน้มที่จะได้รับความคิดเห็นที่ดีเพราะฟังก์ชั่นสั้น ๆ เหล่านี้มีชื่อที่ดีทำให้ฟังก์ชั่นระดับสูงอ่านได้ง่าย แต่ในสถานการณ์ที่มีประสิทธิภาพสูงบางคนแสดงความคิดเห็นเกี่ยวกับจำนวนพื้นที่ การประมวลผล สิ่งที่สองที่ฉันทำคือแบ่งคลาสระหว่างไฟล์เพื่อสร้างไฟล์ที่สั้นกว่า สิ่งนี้จะช่วยลดระยะห่างในการเลื่อนเพื่อไปยังฟังก์ชั่นที่เกี่ยวข้องและขึ้นอยู่กับองค์กรซึ่งอาจทำให้ฉันสามารถวางไฟล์บนจอภาพที่แตกต่างกันเพื่อดูกัน วิธีปฏิบัติทั้งสองนี้ใช้สำหรับหน่วยที่สามารถบันทึกได้มากขึ้นซึ่งรูปแบบการเข้ารหัสส่วนใหญ่ต้องการเอกสารฉันซึ่งทำให้ปัญหาแย่ลงอีกโดยขยายความยาวของไฟล์ของฉันและระยะห่างระหว่างฟังก์ชันที่เกี่ยวข้อง ปัจจุบันฉันใช้ Visual Studio ซึ่งอนุญาตให้มีการพับโค้ดในระดับฟังก์ชั่นและระดับบล็อกความคิดเห็น (ซึ่งฉันใช้บ่อย) แต่ไม่ได้พับที่ระดับวงเล็บเหมือนที่ Notepad ++ ทำ เครื่องมือแก้ไขที่ให้การพับโค้ดที่ดีกว่านั้นไม่มีคุณสมบัติ Intellisense ทั้งหมดของ VS ฉันสามารถใช้ภูมิภาคใน VS ได้ แต่มันดูรกมากถ้าใช้ทุกๆ 10 บรรทัด การพับเป็นบางครั้งมีประโยชน์ในการทำให้โค้ดสมบูรณ์โดยที่ฉันยังทำงานกับฟีเจอร์ต่าง ๆ ของโค้ด ใครช่วยแนะนำการเขียนโค้ดที่ดีขึ้นเพื่อช่วยในการมองเห็นรหัสที่ จำกัด ?

10
การใช้งาน LINQ และ Lambda Expressions นำไปสู่รหัสที่อ่านได้น้อยลงหรือไม่ [ปิด]
ฉันกำลังพูดคุยกับเพื่อนร่วมงานใน Linq ฉันจะคัดลอกที่นี่: ผู้ร่วมงาน: ขอซื่อสัตย์ที่นี่ ไวยากรณ์ Linq แย่มาก มันสับสนและไม่ง่าย ฉัน: โอ้มาเลยสับสนมากกว่า T-SQL เหรอ? เพื่อนร่วมงาน: เอ่อใช่ ฉัน: มันมีส่วนพื้นฐานเดียวกันเลือกสถานที่และจาก ผู้ร่วมงาน: Linq สำหรับฉันคือการกำจัดไอเท็มเชิงสัมพันธ์ + OO ผู้ร่วมงาน: อย่าเข้าใจฉันผิด - มันมีประสิทธิภาพอย่างไม่น่าเชื่อ แต่พวกเขาเรียกคืน SQL เพื่อใช้การเก็บรวบรวมวัตถุ agains ฉันเห็นว่าการใช้ Linq + Lamda นั้นทรงพลังมาก (เขาเห็นด้วย) และทำให้อ่านรหัสได้ง่ายขึ้น (เขาไม่เห็นด้วยกับจุดนั้น): pickFiles = from f in pickFolder.GetFiles("*.txt") where ValidAuditFileName.IsMatch(f.Name) select f; หรือ var …

6
วิธีการจัดรูปแบบที่อ่านง่ายที่สุดหากมีเงื่อนไข [ปิด]
ifสภาพที่คดเคี้ยวยาวควรหลีกเลี่ยงหากเป็นไปได้ แต่บางครั้งเราทุกคนก็เขียนลงไป แม้ว่ามันจะเป็นเงื่อนไขที่ง่ายมากบางครั้งข้อความที่เกี่ยวข้องก็เป็นคำที่ใช้ง่ายมากดังนั้นเงื่อนไขทั้งหมดจึงมีความยาวมาก วิธีการจัดรูปแบบที่อ่านง่ายที่สุดคืออะไร if (FoobarBaz::quxQuux(corge, grault) || !garply(waldo) || fred(plugh) !== xyzzy) { thud(); } หรือ if ( FoobarBaz::quxQuux(corge, grault) || !garply(waldo) || fred(plugh) !== xyzzy ) { thud(); } หรือ if (FoobarBaz::quxQuux(corge, grault) || !garply(waldo) || fred(plugh) !== xyzzy) { thud(); } หรือ thudable = FoobarBaz::quxQuux(corge, grault); thudable …

9
“ การหลีกเลี่ยงปัญหาโยโย่” เป็นเหตุผลที่ถูกต้องหรือไม่ที่จะยอมให้
ตามที่ครอบงำจิตใจดั้งเดิมคือเมื่อไม่ได้กลิ่นรหัส? ฉันควรสร้างวัตถุ ZipCode เพื่อแสดงรหัสไปรษณีย์แทนวัตถุ String อย่างไรก็ตามจากประสบการณ์ของฉันฉันชอบดู public class Address{ public String zipCode; } แทน public class Address{ public ZipCode zipCode; } เพราะฉันคิดว่าอันหลังต้องการให้ฉันย้ายไปที่คลาส ZipCode เพื่อทำความเข้าใจกับโปรแกรม และฉันเชื่อว่าฉันต้องย้ายระหว่างหลาย ๆ คลาสเพื่อดูคำจำกัดความถ้าทุกเขตข้อมูลดั้งเดิมถูกแทนที่ด้วยคลาสซึ่งรู้สึกราวกับว่าทุกข์ทรมานจากปัญหาโยโย่ (รูปแบบการต่อต้าน) ดังนั้นฉันต้องการย้ายวิธีการ ZipCode เป็นคลาสใหม่ตัวอย่างเช่น: เก่า: public class ZipCode{ public boolean validate(String zipCode){ } } ใหม่: public class ZipCodeHelper{ public static boolean validate(String zipCode){ …

11
มันเป็นนิสัยที่ไม่ดีที่ไม่ได้ใช้อินเตอร์เฟสหรือไม่? [ปิด]
ฉันใช้ส่วนต่อประสานที่ไม่ค่อยพบและพบได้ทั่วไปในรหัสอื่น นอกจากนี้ฉันสร้างคลาสย่อยและคลาสพิเศษ (ในขณะที่สร้างคลาสของตัวเอง) ไม่ค่อยมีในรหัสของฉัน มันเป็นสิ่งที่ไม่ดี? คุณแนะนำให้เปลี่ยนสไตล์นี้ไหม สไตล์นี้มีผลข้างเคียงหรือไม่? เป็นเพราะฉันไม่ได้ทำงานในโครงการขนาดใหญ่หรือไม่?

8
การแปลงคำสั่ง IF
ดังนั้นฉันจึงเขียนโปรแกรมมาหลายปีแล้วและเพิ่งเริ่มใช้ ReSharper มากขึ้น สิ่งหนึ่งที่ ReSharper แนะนำให้ฉันเสมอคือ "กลับด้าน" ถ้า "คำสั่งเพื่อลดการซ้อน" สมมติว่าฉันมีรหัสนี้: foreach (someObject in someObjectList) { if(someObject != null) { someOtherObject = someObject.SomeProperty; } } และ ReSharper จะแนะนำให้ฉันทำสิ่งนี้: foreach (someObject in someObjectList) { if(someObject == null) continue; someOtherObject = someObject.SomeProperty; } ดูเหมือนว่า ReSharper จะแนะนำให้ฉันย้อนกลับ IFs ไม่ว่าจะทำรังมากแค่ไหนก็ตาม ปัญหานี้คือฉันชอบทำรังในสถานการณ์อย่างน้อยบางครั้ง สำหรับฉันนั้นดูเหมือนง่ายต่อการอ่านและเข้าใจว่าเกิดอะไรขึ้นในบางสถานที่ นี่ไม่ใช่กรณีเสมอไป แต่ฉันรู้สึกสะดวกสบายในการทำรังในบางครั้ง คำถามของฉันคือ: …

13
การใช้พารามิเตอร์บูลีนผิดพลาดหรือไม่
ตามที่มันเป็นความผิดที่จะใช้พารามิเตอร์แบบบูลเพื่อตรวจสอบพฤติกรรม? ฉันรู้ถึงความสำคัญของการหลีกเลี่ยงการใช้พารามิเตอร์บูลีนเพื่อกำหนดพฤติกรรมเช่น: รุ่นเดิม public void setState(boolean flag){ if(flag){ a(); }else{ b(); } c(); } เวอร์ชั่นใหม่: public void setStateTrue(){ a(); c(); } public void setStateFalse(){ b(); c(); } แต่วิธีการเกี่ยวกับกรณีที่พารามิเตอร์บูลีนจะใช้ในการกำหนดค่าแทนพฤติกรรม? เช่น: public void setHint(boolean isHintOn){ this.layer1.visible=isHintOn; this.layer2.visible=!isHintOn; this.layer3.visible=isHintOn; } ฉันกำลังพยายามกำจัดการตั้งค่าสถานะ isHintOn และสร้าง 2 ฟังก์ชันที่แยกกัน: public void setHintOn(){ this.layer1.visible=true; this.layer2.visible=false; this.layer3.visible=true; } public …

13
ในภาษาที่ไม่อนุญาตขีดล่างในค่าคงที่จำนวนเต็มเป็นวิธีปฏิบัติที่ดีในการสร้างค่าคงที่ 1 พันล้านหรือไม่
ในภาษาที่ไม่อนุญาตขีดล่างเป็นตัวอักษรจำนวนเต็มคุณควรสร้างค่าคงที่ 1 พันล้านหรือไม่ เช่นใน C ++: size_t ONE_BILLION = 1000000000; แน่นอนว่าเราไม่ควรสร้างค่าคงที่สำหรับตัวเลขขนาดเล็กเช่น 100 แต่ด้วยค่าศูนย์ 9 มันเป็นเรื่องง่ายที่จะละทิ้งศูนย์หรือเพิ่มรหัสพิเศษในโค้ดดังนี้: tv_sec = timeInNanosec / 1000000000; tv_nsec = timeInNanosec % 1000000000;

14
การล้างโค้ดของคนอื่นสำคัญอย่างไรเมื่อต้องเผชิญกับกำหนดเวลาที่แน่นหนา [ปิด]
(ฉันกำลังพูดถึงโค้ด HTML / CSS (ไม่ใช่ภาษาการเขียนโปรแกรม) แต่ฉันคิดว่าเรายังต้องเผชิญกับปัญหาเช่นเดียวกับโปรแกรมเมอร์) ฉันเป็นนักออกแบบ front-end อาวุโสในทีมและฉันมักจะต้องทำผลงานใหม่ของรุ่นน้องในเวลาที่ จำกัด ฉันกำลังเผชิญกับปัญหาที่ 2: สไตล์การเขียนโค้ดของพวกเขาค่อนข้างยุ่งเหยิง ความสวยงามไม่ดี ฉันพบสไตล์การเข้ารหัสของพวกเขาว่าเป็นถุงผสมที่ไม่มีแบบแผน / มาตรฐานที่เหมาะสม ฉันขาดการทำความสะอาดรหัสหรือจัดการกับรหัสของพวกเขา (แม้แต่การคัดลอกวิธีที่พวกเขาทำ) ฉันคิดว่ามันน่าหงุดหงิดที่จะทำตามสไตล์การเขียนรหัสเพราะฉันรู้สึกว่าฉันอาจเรียนรู้นิสัยที่ไม่ดี แต่นั่นเป็นวิธีที่เร็วที่สุดในการประชุมกำหนดเวลา สำหรับผู้ที่มีประสบการณ์มากขึ้นซึ่งมีประสิทธิภาพมากขึ้น? ฉันควรบันทึกการล้างข้อมูลไว้เพื่อใช้ในภายหลังหรือไม่ หรือทำความสะอาดระหว่างทางเมื่อฉันทำการเปลี่ยนแปลง? (ฉันไม่ต้องการที่จะฟังดูหยิ่ง แต่นั่นคือความจริงมันจะใช้เวลาหลายปีกว่าในการเขียนโค้ดที่ดีกว่าฉันรู้ฉันเขียนโค้ดยุ่ง ๆ เมื่อฉันเริ่มต้น)

11
การเปลี่ยนสไตล์การเขียนโค้ดในโครงการโอเพ่นซอร์สนั้นไม่เป็นไปตามที่ควรหรือไม่
เมื่อเร็ว ๆ นี้ผมมาในจำนวนของโอเพนซอร์สทับทิม (หรือส่วนใหญ่ของมันเป็นทับทิม) โครงการบน GitHubว่าเมื่อตรวจสอบด้วยเครื่องมือวิเคราะห์รหัสเช่นRubocopสร้างจำนวนมากของการกระทำผิด ตอนนี้ความผิดส่วนใหญ่เหล่านี้รวมถึงการใช้เครื่องหมายอัญประกาศคู่แทนการอ้างอิงเดี่ยว (เมื่อไม่มีการแก้ไข) ไม่ปฏิบัติตามกฎ 2 ช่องว่างต่อกฎระดับมากกว่ากฎความยาวบรรทัด 80 อักขระหรือใช้{และ}สำหรับบล็อกหลายบรรทัด [คู่มือ] Ruby style แนะนำวิธีปฏิบัติที่ดีที่สุดเพื่อให้โปรแกรมเมอร์ Ruby ในโลกแห่งความจริงสามารถเขียนโค้ดที่สามารถดูแลได้โดยโปรแกรมเมอร์ Ruby จากโลกแห่งความเป็นจริง ~ ที่มา: คู่มือสไตล์ทับทิม แม้ว่าจะมีขนาดเล็กและง่ายต่อการแก้ไขมันเหมาะสมหรือไม่ที่จะเปลี่ยนรูปแบบการเข้ารหัสของโครงการโอเพ่นซอร์สโดยการแก้ไขความผิดและทำการร้องขอแบบดึง ฉันยอมรับว่าบางโครงการเช่น Rails ไม่ยอมรับการเปลี่ยนแปลงเครื่องสำอางและบางอันก็ใหญ่เกินกว่าที่จะ "แก้ไข" ทั้งหมดในครั้งเดียว (ตัวอย่างเช่น Rails สร้างความผิดมากกว่า 80,000 ครั้งเมื่อ Rubocop ทำงาน - ไม่ว่าพวกเขาจะมีการเข้ารหัสขนาดเล็กอนุสัญญาที่ควรปฏิบัติตามเมื่อมีส่วนร่วม) ท้ายที่สุดแล้วRuby Style Guideมีเหตุผลร่วมกับเครื่องมือเช่น Rubocop ผู้คนชื่นชมความสอดคล้องดังนั้นการเปลี่ยนแปลงประเภทนี้เป็นการทำสิ่งที่ดีสำหรับชุมชน Ruby โดยทั่วไปใช่ไหม [ผู้แต่งคู่มือ Ruby Style] ไม่ได้เกิดขึ้นกับกฎทั้งหมด …

8
เมื่อใช้วิธีการผูกมัดฉันจะนำวัตถุมาใช้ใหม่หรือสร้างใหม่ได้หรือไม่
เมื่อใช้วิธีการผูกมัดเช่น: var car = new Car().OfBrand(Brand.Ford).OfModel(12345).PaintedIn(Color.Silver).Create(); อาจมีสองวิธี: ใช้วัตถุเดียวกันซ้ำดังนี้: public Car PaintedIn(Color color) { this.Color = color; return this; } สร้างวัตถุชนิดใหม่Carในทุกขั้นตอนดังนี้ public Car PaintedIn(Color color) { var car = new Car(this); // Clone the current object. car.Color = color; // Assign the values to the clone, not the original object. return …

8
รูปแบบที่ยอมรับสำหรับการใช้คำหลัก `this 'ใน Java คืออะไร
ฉันมาจากภาษาต่าง ๆ เช่น Python หรือ Javascript (และอื่น ๆ ที่ไม่ค่อยมีวัตถุประสงค์เชิงวัตถุ) และฉันพยายามปรับปรุงความรู้การทำงานของ Java ซึ่งฉันรู้เพียงแค่ผิวเผินเท่านั้น มันถือว่าเป็นการปฏิบัติที่ไม่ถูกต้องหรือไม่ที่จะผนวกthisเข้ากับแอ็ตทริบิวต์อินสแตนซ์ปัจจุบันเสมอ? ฉันรู้สึกเป็นธรรมชาติมากขึ้นที่จะเขียน ... private String foo; public void printFoo() { System.out.println(this.foo); } ... กว่า ... private String foo; public void printFoo() { System.out.println(foo); } ... มันช่วยให้ฉันแยกแยะแอตทริบิวต์ของอินสแตนซ์จากตัวแปรโลคอล แน่นอนในภาษาอย่าง Javascript มันสมเหตุสมผลมากกว่าที่จะใช้เสมอthisเนื่องจากมีหนึ่งฟังก์ชันที่สามารถซ้อนฟังก์ชันได้ดังนั้นตัวแปรท้องถิ่นจึงมาจากขอบเขตที่กว้างขึ้น ใน Java เท่าที่ฉันเข้าใจไม่มีการทำรังแบบนี้เป็นไปได้ (ยกเว้นคลาสภายใน) ดังนั้นอาจไม่ใช่ปัญหาใหญ่ ในกรณีใด ๆ thisฉันชอบที่จะใช้ มันจะรู้สึกแปลกและไม่สำนวนหรือไม่?

15
ฉันควรจะฝึกการเขียนโปรแกรมด้วยตนเองหรือเรียนรู้วิธีการเข้ารหัสอย่างมืออาชีพ [ปิด]
เมื่อไม่นานมานี้ฉันได้ทำงานอย่างมืออาชีพออกไปเที่ยวกับโปรแกรมเมอร์คนอื่น ๆ และหาเพื่อนในอุตสาหกรรมนี้ สิ่งเดียวคือฉันเรียนรู้ด้วยตนเอง 100% มันทำให้สไตล์ของฉันเบี่ยงเบนไปจากสไตล์ของผู้ที่ได้รับการฝึกฝนอย่างเหมาะสม มันเป็นเทคนิคและการจัดระเบียบของรหัสของฉันที่แตกต่างกัน มันเป็นส่วนผสมของหลายสิ่งที่ฉันทำ ฉันมักจะผสมผสานกระบวนทัศน์การเขียนโปรแกรมหลายอย่างเข้าด้วยกัน ชอบฟังก์ชั่นและ OO ฉันเอนตัวไปยังส่วน Functional มากกว่า OO แต่ฉันเห็นการใช้ OO เมื่อมีบางสิ่งที่สมเหตุสมผลสำหรับนามธรรม เหมือนเกมวัตถุ ต่อไปฉันก็ไปเส้นทางที่เรียบง่ายเมื่อทำอะไรบางอย่าง ในทางกลับกันดูเหมือนว่าบางครั้งรหัสที่ฉันเห็นจากโปรแกรมเมอร์มืออาชีพนั้นซับซ้อนเพื่อประโยชน์ของมัน! ฉันใช้การปิดเยอะ และท้ายที่สุดฉันไม่ใช่คนวิจารณ์ที่ดีที่สุด ฉันพบว่าการอ่านรหัสของฉันง่ายกว่าการอ่านความคิดเห็น และกรณีส่วนใหญ่ฉันเพิ่งอ่านรหัสแม้ว่าจะมีความคิดเห็น นอกจากนี้ฉันยังได้รับการบอกว่าเพราะฉันเขียนรหัสของฉันได้ง่ายเพียงแค่อ่าน ฉันได้ยินว่าโปรแกรมเมอร์ที่ผ่านการฝึกอบรมอย่างมืออาชีพยังคงดำเนินต่อไปเกี่ยวกับเรื่องต่าง ๆ เช่นการทดสอบหน่วย บางสิ่งที่ฉันไม่เคยใช้มาก่อนดังนั้นฉันจึงไม่มีแม้แต่ความคิดที่ลึกซึ้งที่สุดว่าพวกเขาคืออะไรหรือทำงานอย่างไร ขีดเส้นใต้จำนวนมาก "_" ซึ่งไม่ใช่รสนิยมของฉัน เทคนิคส่วนใหญ่ที่ฉันใช้ตรงจากฉันหรือหนังสือสองสามเล่มที่ฉันอ่าน ไม่ทราบอะไรเกี่ยวกับ MVC ฉันเคยได้ยินมามากมายเกี่ยวกับเรื่องนี้ด้วยสิ่งต่าง ๆ เช่น backbone.js ฉันคิดว่ามันเป็นวิธีการจัดระเบียบแอปพลิเคชัน มันทำให้ฉันสับสนเพราะตอนนี้ฉันสร้างโครงสร้างองค์กรของตัวเองแล้ว มันช่างเจ็บปวดเหลือเกิน ฉันไม่สามารถใช้แอปพลิเคชันเทมเพลตได้เลยเมื่อเรียนรู้สิ่งใหม่ ๆ อย่าง Ubuntu อย่างรวดเร็ว ฉันมีปัญหาในการทำความเข้าใจรหัสที่ฉันสามารถบอกได้ว่ามาจากผู้ที่ได้รับการฝึกฝน การเขียนโปรแกรม …

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