คำถามติดแท็ก code-smell

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

19
#regions มี Antipattern หรือกลิ่นรหัสหรือไม่
C # ช่วยให้การใช้#region/ #endregionคำหลักเพื่อให้พื้นที่ของรหัสพับในการแก้ไข เมื่อใดก็ตามที่ฉันทำสิ่งนี้แม้ว่าฉันจะทำมันเพื่อซ่อนโค้ดขนาดใหญ่ที่อาจได้รับการ refactored เป็นคลาสหรือวิธีการอื่น ตัวอย่างเช่นฉันได้เห็นวิธีการที่มีรหัส 500 บรรทัดที่มี 3 หรือ 4 ภูมิภาคเพื่อให้สามารถจัดการได้ การใช้พื้นที่อย่างรอบคอบเป็นสัญญาณของปัญหาหรือไม่? ดูเหมือนว่าจะเป็นเช่นนั้นกับฉัน
264 c#  code-smell 

7
การประเมินการลัดวงจรมันเป็นการปฏิบัติที่ไม่ดีเหรอ?
สิ่งที่ฉันรู้จักมาระยะหนึ่ง แต่ไม่เคยพิจารณามาก่อนคือภาษาส่วนใหญ่มีความเป็นไปได้ที่จะให้ความสำคัญกับผู้ประกอบการในคำสั่ง if ตามคำสั่งของพวกเขา ฉันมักจะใช้สิ่งนี้เป็นวิธีในการป้องกันข้อยกเว้นอ้างอิงเป็นโมฆะเช่น: if (smartphone != null && smartphone.GetSignal() > 50) { // Do stuff } ในกรณีนี้รหัสจะส่งผลในการตรวจสอบครั้งแรกว่าวัตถุไม่เป็นโมฆะและจากนั้นใช้วัตถุนี้รู้ว่ามันมีอยู่ ภาษานั้นฉลาดเพราะรู้ว่าถ้าคำสั่งแรกถ้าเป็นเท็จก็ไม่มีประโยชน์ที่จะประเมินคำสั่งที่สองและดังนั้นจึงไม่มีข้อยกเว้นการอ้างอิงโมฆะ สิ่งนี้ใช้งานได้เหมือนกันสำหรับตัวดำเนินการandและor สิ่งนี้มีประโยชน์ในสถานการณ์อื่น ๆ เช่นการตรวจสอบว่าดัชนีอยู่ในขอบเขตของอาเรย์และเทคนิคดังกล่าวสามารถทำได้ในหลายภาษาตามความรู้ของฉัน: Java, C #, C ++, Python และ Matlab คำถามของฉันคือ: รหัสประเภทนี้เป็นตัวแทนของการปฏิบัติที่ไม่ดีหรือไม่? การปฏิบัติที่ไม่ดีนี้เกิดขึ้นจากปัญหาทางเทคนิคที่ซ่อนอยู่หรือไม่ (เช่นนี้อาจส่งผลให้เกิดข้อผิดพลาด) หรือนำไปสู่ปัญหาความสามารถในการอ่านสำหรับโปรแกรมเมอร์อื่น ๆ หรือไม่? มันอาจสร้างความสับสนได้ไหม

17
วิธีฝึกตัวเองให้หลีกเลี่ยงการเขียนรหัส“ ฉลาด” [ปิด]
คุณรู้หรือไม่ว่าความรู้สึกนั้นเมื่อคุณต้องการที่จะแสดงให้เห็นถึงเคล็ดลับใหม่ที่มีExpressions หรือวางแนวทางที่แตกต่างกันสามขั้นตอน? สิ่งนี้ไม่จำเป็นต้องอยู่ในระดับสถาปัตยกรรมนักบินอวกาศและในความเป็นจริงอาจเป็นประโยชน์ แต่ฉันอดไม่ได้ที่จะสังเกตเห็นว่าคนอื่นจะใช้คลาสเดียวกันหรือแพ็คเกจเดียวกันอย่างชัดเจนตรงไปตรงมา (และบางครั้งน่าเบื่อ) ฉันสังเกตว่าฉันมักจะออกแบบโปรแกรมด้วยการแก้ไขปัญหาบางครั้งก็จงใจและบางครั้งก็เบื่อ ไม่ว่าในกรณีใดฉันมักจะเชื่อโดยสุจริตว่าโซลูชันของฉันนั้นใสและสง่างามจนกระทั่งฉันเห็นหลักฐานที่ตรงกันข้าม แต่โดยปกติแล้วมันจะสายเกินไป นอกจากนี้ยังมีส่วนหนึ่งของฉันที่ชอบสมมติฐานที่ไม่มีเอกสารในการทำสำเนารหัสและความฉลาดในการเรียบง่าย ฉันจะทำอะไรได้บ้างที่จะต่อต้านการกระตุ้นให้เขียนรหัส“ ฉลาด”และเสียงกระดิ่งที่ฉันควรทำเมื่อใด ปัญหาคือการผลักมากขึ้นขณะที่ฉันกำลังทำงานกับทีมนักพัฒนาที่มีประสบการณ์และบางครั้งความพยายามของฉันในการเขียนรหัสสมาร์ทดูเหมือนโง่เง่าแม้แต่กับตัวเองหลังจากเวลาผ่านไปภาพลวงตาของความสง่างาม

2
รหัส“ คุณสมบัติอิจฉา” คืออะไรและเหตุใดจึงถือว่าเป็นกลิ่นรหัส
นี้คำถามเกี่ยวกับ SOพูดคุยเกี่ยวกับการแก้ไขสิ่งที่คิด OP คือคุณลักษณะอิจฉารหัส อีกตัวอย่างหนึ่งที่ฉันเห็นวลีที่ดีนี้ถูกอ้างถึงในคำตอบที่ได้รับเมื่อเร็ว ๆ นี้ใน programmers.SE ถึงแม้ว่าผมจะไม่ได้ลดลงในความคิดเห็นที่จะตอบว่าขอให้ข้อมูลที่ผมคิดว่ามันจะมีการช่วยเหลือทั่วไปในการเขียนโปรแกรมต่อไปนี้ Q & A ที่จะเข้าใจสิ่งที่หมายโดยระยะคุณลักษณะอิจฉา โปรดแก้ไขแท็กเพิ่มเติมหากคุณคิดว่าเหมาะสม

12
หากรหัสทดสอบหน่วยของคุณ“ มีกลิ่น” มีความสำคัญหรือไม่?
โดยปกติฉันแค่ทำการทดสอบหน่วยของฉันด้วยกันโดยใช้การคัดลอกและวางและวิธีปฏิบัติที่ไม่ดีอื่น ๆ การทดสอบหน่วยมักจะดูน่าเกลียดมากพวกเขาเต็มไปด้วย "กลิ่นรหัส" แต่สิ่งนี้สำคัญหรือไม่ ฉันมักจะบอกตัวเองตราบใดที่รหัส "ของจริง" คือ "ดี" นั่นคือทั้งหมดที่สำคัญ นอกจากนี้การทดสอบหน่วยมักจะต้องการ "แฮ็กที่มีกลิ่นเหม็น" ที่หลากหลายเช่นฟังก์ชั่นขัดถู ฉันควรกังวลเกี่ยวกับการทดสอบหน่วยที่ออกแบบมาไม่ดี ("เหม็น") อย่างไร

10
ตัวแปรสถานะเป็นความชั่วร้ายหรือไม่? [ปิด]
ตัวแปรสถานะเป็นสิ่งชั่วร้ายหรือไม่? ตัวแปรต่อไปนี้มีความผิดศีลธรรมอย่างลึกซึ้งและเป็นสิ่งที่ชั่วร้ายหรือไม่ที่จะใช้มัน "ตัวแปรบูลีนหรือเลขจำนวนเต็มที่คุณกำหนดค่าในบางสถานที่จากนั้นลงมาด้านล่างคุณตรวจสอบแล้วใน orther ที่จะทำอะไรหรือไม่เช่นเช่นใช้newItem = trueแล้วบางบรรทัดด้านล่างif (newItem ) then" ฉันจำได้ว่าทำสองโครงการที่ฉันละเลยการใช้ค่าสถานะทั้งหมดและจบลงด้วยสถาปัตยกรรม / รหัสที่ดีขึ้น อย่างไรก็ตามมันเป็นวิธีปฏิบัติทั่วไปในโครงการอื่น ๆ ที่ฉันทำงานด้วยและเมื่อโค้ดเติบโตและมีการเพิ่มแฟล็ก IMHO code-spaghetti ก็จะโตขึ้นเช่นกัน คุณจะบอกว่ามีกรณีใดบ้างที่การใช้ค่าสถานะเป็นวิธีปฏิบัติที่ดีหรือจำเป็นหรือไม่หรือคุณยอมรับว่าการใช้ค่าสถานะในรหัสคือ ... ค่าสถานะสีแดงและควรหลีกเลี่ยง / refactored ฉันฉันเพิ่งได้รับโดยการทำฟังก์ชั่น / วิธีการที่ตรวจสอบสถานะในเวลาจริงแทน

10
มีเหตุผลใดที่จะใช้คลาส "ข้อมูลเก่าแบบธรรมดา" หรือไม่?
ในรหัสดั้งเดิมบางครั้งฉันเห็นชั้นเรียนที่ไม่มีอะไรนอกจากห่อหุ้มข้อมูล สิ่งที่ต้องการ: class Bottle { int height; int diameter; Cap capType; getters/setters, maybe a constructor } ความเข้าใจของฉันเกี่ยวกับ OO คือคลาสเป็นโครงสร้างของข้อมูลและวิธีการทำงานกับข้อมูล ดูเหมือนว่าจะแยกประเภทของวัตถุนี้ สำหรับฉันพวกเขาไม่มีอะไรมากไปกว่าstructsและชนิดของความพ่ายแพ้วัตถุประสงค์ของ OO ฉันไม่คิดว่ามันจะเป็นสิ่งชั่วร้ายแม้ว่ามันอาจจะเป็นกลิ่นรหัส มีกรณีที่วัตถุดังกล่าวจะมีความจำเป็นหรือไม่? หากมีการใช้งานบ่อยมันจะทำให้ผู้ต้องสงสัยในการออกแบบหรือไม่

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

5
ไฟล์โค้ดมีขนาดใหญ่เกินไป?
ฉันกำลังค้นหาไฟล์บรรทัด 2-3k มากมายและมันก็ไม่ได้รู้สึกว่ามันควรจะใหญ่ขนาดนั้น อะไรคือเกณฑ์ที่ดีในการโทรหาไฟล์ซอร์สโค้ดอย่างออบเจ็กต์ "ใหญ่เกินไป"?

6
มันจะโอเคที่จะมีกลิ่นรหัสหรือไม่ถ้ายอมรับวิธีแก้ปัญหาที่ง่ายกว่าสำหรับปัญหาอื่น? [ปิด]
กลุ่มเพื่อนและฉันทำงานในโครงการเมื่อไม่นานมานี้และเราต้องการคิดค้นวิธี OOP ที่ดีเพื่อแสดงสถานการณ์ที่เฉพาะเจาะจงกับผลิตภัณฑ์ของเรา โดยพื้นฐานแล้วเรากำลังทำงานกับเกมกระสุนนรกสไตล์ Touhou และเราต้องการสร้างระบบที่เราสามารถแสดงพฤติกรรมที่เป็นไปได้ของกระสุนได้อย่างง่ายดายที่เราสามารถฝันได้ นั่นคือสิ่งที่เราทำ เราสร้างสถาปัตยกรรมที่สง่างามอย่างแท้จริงซึ่งทำให้เราสามารถแยกพฤติกรรมของกระสุนปืนออกเป็นส่วนประกอบต่าง ๆ ที่สามารถแนบไปกับกระสุนได้ตามใจชอบระบบส่วนประกอบของ Unity มันใช้งานได้ดีมันขยายได้ง่ายมีความยืดหยุ่นและครอบคลุมฐานทั้งหมดของเรา แต่มีปัญหาเล็กน้อย แอปพลิเคชันของเรายังเกี่ยวข้องกับการสร้างขั้นตอนจำนวนมากกล่าวคือเราสร้างพฤติกรรมของกระสุน เหตุใดจึงเป็นปัญหา วิธีแก้ปัญหา OOP ของเราคือการแสดงพฤติกรรมกระสุนในขณะที่สง่างามมีความซับซ้อนเล็กน้อยในการทำงานโดยไม่มีมนุษย์ มนุษย์ฉลาดพอที่จะคิดถึงวิธีแก้ปัญหาที่มีเหตุผลและชาญฉลาด อัลกอริธึมการสร้างโพรซีเดอร์ยังไม่ฉลาดและเราพบว่ามันยากที่จะใช้ AI ที่ใช้สถาปัตยกรรม OOP ของเราให้มีศักยภาพสูงสุด เป็นที่ยอมรับว่าเป็นข้อบกพร่องของสถาปัตยกรรมคือมันไม่ง่ายในทุกสถานการณ์ ดังนั้นเพื่อแก้ไขปัญหานี้โดยทั่วไปเราได้ผลักดันพฤติกรรมทั้งหมดที่ส่วนประกอบต่าง ๆ นำเสนอให้กับคลาสกระสุนเพื่อให้ทุกสิ่งที่เราสามารถจินตนาการได้ถูกนำเสนอโดยตรงในแต่ละอินสแตนซ์ของสัญลักษณ์แสดงหัวข้อย่อย นี้จะทำให้ขั้นตอนรุ่นของเราขั้นตอนวิธีการง่ายขึ้นเล็ก ๆ น้อย ๆ ในการทำงานด้วย แต่ตอนนี้ระดับกระสุนของเราเป็นอย่างมากวัตถุพระเจ้า มันเป็นคลาสที่ใหญ่ที่สุดในโปรแกรมอย่างง่ายจนมีโค้ดมากกว่าห้าเท่ามากกว่าอย่างอื่น มันค่อนข้างเจ็บปวดที่ต้องดูแลเช่นกัน เป็นไรไหมที่ชั้นเรียนของเราคนหนึ่งเปลี่ยนเป็นเทพเจ้าวัตถุเพื่อให้ง่ายต่อการทำงานกับปัญหาอื่น? โดยทั่วไปแล้วจะเป็นการดีไหมที่จะมีกลิ่นของรหัสในรหัสของคุณหากยอมรับวิธีการแก้ปัญหาที่ง่ายกว่าสำหรับปัญหาอื่น

5
ถือว่าเป็น Pythonic ที่มีหลายคลาสที่กำหนดไว้ในไฟล์เดียวกันหรือไม่?
ในการทำงานกับ python เป็นครั้งแรกฉันพบว่าฉันเขียนหลายคลาสในไฟล์เดียวกันซึ่งตรงข้ามกับภาษาอื่นเช่น Java ซึ่งใช้หนึ่งไฟล์ต่อหนึ่งคลาส โดยปกติแล้วคลาสเหล่านี้จะประกอบไปด้วยคลาสฐานนามธรรม 1 ชุดโดยมีการใช้งานอย่างเป็นรูปธรรม 1-2 รายการซึ่งการใช้งานแตกต่างกันเล็กน้อย ฉันโพสต์ไฟล์ดังกล่าวหนึ่งไฟล์ด้านล่าง: class Logger(object): def __init__(self, path, fileName): self.logFile = open(path + '/' + filename, 'w+') self.logFile.seek(0, 2) def log(self, stringtoLog): self.logFile.write(stringToLog) def __del__(self): self.logFile.close() class TestLogger(Logger): def __init__(self, serialNumber): Logger.__init__('/tests/ModuleName', serialNumber): def readStatusLine(self): self.logFile.seek(0,0) statusLine = self.logFile.readLine() self.logFile.seek(0,2) return StatusLine …

6
หลายคลาสในไฟล์. cs เดียว - ดีหรือไม่ดี [ปิด]
ขอแนะนำให้สร้างหลายคลาสภายในไฟล์. cs หรือควรแต่ละไฟล์. cs มีคลาสแยกต่างหาก ตัวอย่างเช่น: public class Items { public class Animal { } public class Person { } public class Object { } } หลบข้อเท็จจริงที่ว่านี่เป็นตัวอย่างที่ดีของสถาปัตยกรรมที่ดีมีมากกว่าหนึ่งคลาสในไฟล์. cs ที่มีกลิ่นรหัสหรือไม่
30 c#  code-smell 

5
การเป็นเจ้าของรหัสนั้นเป็นกลิ่นรหัสหรือไม่
นี่คือสิ่งที่ฉันคิดเกี่ยวกับนับตั้งแต่ฉันอ่านคำตอบนี้ในหัวข้อความคิดเห็นการเขียนโปรแกรมขัดแย้ง : งานของคุณคือการออกจากงาน เมื่อคุณเขียนซอฟต์แวร์สำหรับนายจ้างของคุณซอฟต์แวร์ใด ๆ ที่คุณสร้างขึ้นจะต้องเขียนในลักษณะที่นักพัฒนาซอฟต์แวร์สามารถหยิบขึ้นมาและเข้าใจด้วยความพยายามเพียงเล็กน้อย มันถูกออกแบบมาอย่างดีเขียนอย่างชัดเจนและต่อเนื่องจัดรูปแบบเรียบร้อยเอกสารที่จะต้องสร้างทุกวันตามที่คาดไว้ตรวจสอบลงในพื้นที่เก็บข้อมูลและรุ่นที่เหมาะสม หากคุณถูกรถบัสโดนไล่ออกไล่ออกหรือเดินออกจากงานนายจ้างของคุณควรจะสามารถแทนที่คุณได้ในเวลาหนึ่งและผู้ชายคนต่อไปก็สามารถเข้ามารับบทบาทของคุณหยิบรหัสและขึ้น ทำงานภายในหนึ่งสัปดาห์ หากเขาหรือเธอไม่สามารถทำเช่นนั้นได้คุณก็ล้มเหลวอย่างน่าสังเวช น่าสนใจฉันพบว่าการมีเป้าหมายนั้นทำให้ฉันมีค่ามากขึ้นสำหรับนายจ้างของฉัน ยิ่งฉันพยายามทิ้งมากเท่าไหร่ฉันก็ยิ่งมีค่ามากขึ้นเท่านั้น และได้มีการพูดคุยกันในคำถามอื่น ๆ เช่นคำถามนี้แต่ฉันต้องการนำมันขึ้นมาอีกครั้งเพื่อพูดคุยจากจุดที่ว่างเปล่ามากกว่า " มันเป็นกลิ่นรหัส !! " มุมมอง - ซึ่งยังไม่ได้ครอบคลุม ในเชิงลึก ฉันเป็นนักพัฒนามืออาชีพมาสิบปีแล้ว ฉันมีงานหนึ่งที่เขียนรหัสได้ดีพอที่จะรับได้อย่างรวดเร็วโดยนักพัฒนาใหม่ที่ดี แต่ในกรณีส่วนใหญ่ในอุตสาหกรรมดูเหมือนว่าการเป็นเจ้าของระดับสูงมาก (ทั้งรายบุคคลและทีม) เป็น บรรทัดฐาน ฐานรหัสส่วนใหญ่ดูเหมือนจะไม่มีเอกสารกระบวนการและ "การเปิดกว้าง" ที่จะช่วยให้ผู้พัฒนารายใหม่สามารถรับและทำงานกับพวกเขาได้อย่างรวดเร็ว ดูเหมือนจะมีกลอุบายและแฮ็กเล็ก ๆ น้อย ๆ ที่ไม่ได้เขียนไว้เสมอซึ่งมีเพียงคนที่รู้รหัสฐานได้ดีมาก ("เป็นเจ้าของ") จะรู้ได้ แน่นอนปัญหาที่เห็นได้ชัดคือ: จะเกิดอะไรขึ้นถ้าบุคคลนั้นหยุดทำงานหรือ "ถูกรถบัสชน"? หรือในระดับทีม: ถ้าทั้งทีมได้รับอาหารเป็นพิษเมื่อออกไปทานอาหารกลางวันที่ทีมและพวกเขาทั้งหมดตาย คุณจะสามารถแทนที่ทีมด้วยชุดนักพัฒนาแบบสุ่มใหม่ ๆ ที่ค่อนข้างเจ็บปวดได้หรือไม่? - ในหลายงานที่ผ่านมาของฉันฉันไม่สามารถจินตนาการได้ว่าจะเกิดอะไรขึ้น ระบบเต็มไปด้วยลูกเล่นและแฮ็คที่คุณ …

11
เพื่อนร่วมงานของฉันสร้างตาราง SQL 96 คอลัมน์
ที่นี่เราอยู่ในปี 2010 วิศวกรซอฟต์แวร์ที่มี 4 หรือ 5 ปีหรือประสบการณ์ยังคงออกแบบตารางที่มีคอลัมน์ 96 fracking ฉันบอกเขาว่ามันจะเป็นฝันร้าย ฉันแสดงให้เขาเห็นว่าเราต้องใช้กฎเพื่อเชื่อมต่อ MySQL กับ C # ฉันอธิบายว่าตารางที่มีคอลัมน์มากกว่าแถวมีกลิ่นมาก ถึงกระนั้นฉันได้รับ "มันจะง่ายขึ้นด้วยวิธีนี้" ฉันควรทำอย่างไร? แก้ไข * ตารางนี้มีข้อมูลจากเซ็นเซอร์ เรามีเซ็นเซอร์ 1 พร้อมด้วย Dynamic_D1X Dynamic_D1Y [... ] Dynamic_D6X Dynamic_D6Y [... ] แก้ไข 2 * ในที่สุดฉันก็ออกจากงานนั้น มันเป็นสัญญาณเมื่อโปรแกรมเมอร์อื่นมืดไปเป็นเวลาหลายเดือนในขณะที่มันเป็นสัญญาณอีกครั้งเมื่อผู้บริหารไม่ได้ตระหนักว่านี่เป็นปัญหา
23 sql  code-smell 

9
init () มีวิธีการดมกลิ่นของรหัสหรือไม่?
มีวัตถุประสงค์ในการประกาศinit()วิธีการสำหรับประเภทใด ๆ ? ฉันไม่ได้ถามว่าเราควรจะต้องการinit()มากกว่านวกรรมิกหรือวิธีการหลีกเลี่ยงการประกาศinit() ฉันถามว่ามีเหตุผลใด ๆ ที่อยู่เบื้องหลังการประกาศinit()วิธีการ (ดูว่ามันเป็นเรื่องธรรมดา) หรือไม่ถ้ามันเป็นกลิ่นรหัสและควรหลีกเลี่ยง init()สำนวนเป็นเรื่องธรรมดามาก แต่ผมยังไม่เห็นประโยชน์ที่แท้จริงใด ๆ ฉันกำลังพูดถึงประเภทที่สนับสนุนการเริ่มต้นด้วยวิธีการ: class Demo { public void init() { //... } } สิ่งนี้จะใช้ในรหัสการผลิตเมื่อใด ฉันรู้สึกว่ามันอาจจะเป็นกลิ่นรหัสเพราะมันบอกว่านวกรรมิกไม่เริ่มต้นวัตถุอย่างสมบูรณ์ทำให้วัตถุที่สร้างขึ้นบางส่วน วัตถุไม่ควรมีอยู่หากไม่ได้ตั้งสถานะ นี่ทำให้ฉันเชื่อว่ามันอาจเป็นส่วนหนึ่งของเทคนิคบางชนิดที่ใช้เพื่อเพิ่มความเร็วในการผลิตในแง่ของการใช้งานระดับองค์กร มันเป็นเหตุผลเดียวที่ฉันคิดได้ว่ามีสำนวนแบบนี้ฉันไม่แน่ใจว่ามันจะมีประโยชน์อย่างไรถ้าเป็นเช่นนั้น

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