เหตุใดการจัดรูปแบบโค้ดที่ไม่สมบูรณ์จึงเป็นเรื่องธรรมดามากกว่า


29

ฉันกำลังอ่านCode Completeและในบทเกี่ยวกับเลย์เอาต์และสไตล์เขาคาดการณ์ว่าผู้แก้ไขโค้ดจะใช้การจัดรูปแบบ Rich Text บางประเภท นั่นหมายความว่าแทนที่จะเป็นรหัสที่มีลักษณะเช่นนี้

Procedure ResolveCollisions
{ Performs a posteriori collision resolution through spatial partitioning algoritm }
(
  CurrentMap : SpriteContext,
  PotentialColliders: SpriteList
)
var Collider  : Sprite, 
    Collidee  : Sprite, 
    Collision : SpriteCollision
begin
  DoStuff();
end.

มันอาจมีลักษณะเช่นนี้:

ขั้นตอน ResolveCollisions

ดำเนินการแก้ไขการชนด้านหลังผ่านอัลกอริทึมการแบ่งพาร์ติชัน

พารามิเตอร์

  • CurrentMap : SpriteContext
  • PotentialColliders : SpriteList

ตัวแปรท้องถิ่น

  • Collider : Sprite
  • Collidee : Sprite
  • Collision : SpriteCollision
    DoStuff();

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

คุณเคยเห็นรหัสที่มีการจัดรูปแบบมาก่อนหรือไม่หรือคุณรู้หรือไม่ว่าแนวคิดนั้นเคยถูกพิจารณาและถูกปฏิเสธในที่สุด


8
คุณเคยเห็นใยแมงมุมของ Knuth หรือไม่? www-cs-staff.stanford.edu/~uno/cweb.html
greyfade



12
ดังนั้นตอนนี้คุณต้องการ Word เป็นตัวแก้ไข IDE ของคุณหรือไม่

5
คุณไม่เคยต่อสู้กับ Word เมื่อทำการจัดรูปแบบแปลก ๆ ที่เป็นไปไม่ได้ที่จะกำจัด ตัวอย่างคุณสมมติว่าตัวแก้ไขซ่อนบางส่วนของซอร์สโค้ดจริง ในฐานะผู้ดูฉันคิดว่ามันคงจะดีถ้าฉันเป็นบรรณาธิการโปรดได้โปรดเมตตาจิตใจผู้น่าสงสารของฉันด้วย!
Newtopian

คำตอบ:


38

ไม่มีเหตุผลทางเทคนิคที่คุณทำไม่ได้ หากโปรแกรมแก้ไขข้อความสามารถทำการเน้นไวยากรณ์ได้พวกเขาก็สามารถเปลี่ยนด้านอื่น ๆ ของการแสดงผลเพื่อเน้นรหัสได้อย่างง่ายดาย

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

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


14

เหตุผลง่ายๆ: ความเป็นอิสระของเครื่องมือแก้ไข /

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

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

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

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

ในสาระสำคัญข้อความการเขียนโปรแกรมได้รับการจัดการที่ดีที่สุดเป็นข้อความธรรมดา - สิ่งที่คุณเห็นคือสิ่งที่เป็นจริง ( ซึ่งสอดคล้องกับแนวความคิด Pythonic ที่ชัดเจนดีกว่าโดยนัย )


28
ไม่จำเป็นต้องเป็นเรื่องจริง หากผู้แก้ไขสามารถทำการเน้นไวยากรณ์ได้ก็สามารถทำไวยากรณ์ "bolding" หรือไวยากรณ์ "font-sizing" เป็นต้น
whatsisname

4
Emacs สามารถกำหนดค่าให้ทำเช่นนี้ แต่ IMO การเปลี่ยนขนาดตัวอักษรอาจทำให้เปลืองพื้นที่หน้าจอ
kevin cline

4
หากผู้เขียนต้องทำการฟอร์แมตด้วยตนเองมันจะเสียเวลา เห็นได้ชัดว่าตัวแก้ไขข้อความจะทำโดยอัตโนมัติหรือคุณอาจใช้สไตล์ชีท
Peter Olson

7
@greegit: ผู้แก้ไขไม่ปล่อยให้มีข้อมูลสีในไฟล์ต้นฉบับเมื่อพวกเขาทำเสร็จแล้วพวกเขาไม่ต้องออกจากการจัดรูปแบบเครื่องหมายอื่น ๆ พวกเขาสามารถสร้างใหม่ได้ตามต้องการ ไม่มีความแตกต่างพื้นฐานระหว่างการเน้นไวยากรณ์และการจัดรูปแบบไวยากรณ์ หากเครื่องมือสามารถสร้างไดอะแกรมคลาส spiffy และไดอะแกรม UML จากซอร์สโค้ดโดยอัตโนมัติเครื่องมืออาจทำให้ตัวหนาเป็นครั้งคราว
whatsisname

9
คำตอบนี้แน่ใจว่ามี upvotes มากมายสำหรับการไม่ถูกต้อง
Jordan

11

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


11

ทำไมมันไม่มีอยู่? ไม่มีความต้องการ / ความต้องการมัน

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


7
+1 สำหรับความต้องการไม่มี ฉันเกลียดที่จะใช้รหัสเช่นนั้น ดูเหมือนว่าฉันกำลังพิมพ์รายงาน TPS ใน Word ไม่ใช่การเขียนรหัส

1
@Glenn Nelson: ฉันเห็นด้วย ฉันหลีกเลี่ยง Word แม้สำหรับการพิมพ์เอกสารปกติถ้าฉันสามารถ (ฉันใช้ LaTeX แทน) ฉันชอบการเน้นไวยากรณ์ แต่การจัดรูปแบบโค้ดที่หลากหลายจะทำให้ฉันรู้สึกรำคาญใจจริงๆ
Giorgio

5

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

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

อีกสิ่งหนึ่งที่ Emacs สามารถทำได้คือแทนที่สัญลักษณ์ที่เหมือน->และforallด้วยและตามลำดับใน Haskell มีเหตุผลเล็กน้อยที่สิ่งเหล่านี้ไม่สามารถขยายไปสู่การจัดรูปแบบตามที่คุณแนะนำได้ยกเว้นว่ามันไม่จำเป็นเลยใน Haskell


2

ก่อนหน้านี้ฉันถามคำถามเกี่ยวกับการจัดรูปแบบโค้ดโดยถามว่าโปรแกรมเมอร์ต้องการให้ฟอร์แมตโค้ดของพวกเขาหรือไม่เมื่อพวกเขาพิมพ์

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

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

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

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


2

นอกจากนี้ในมากกว่าสองสามภาษา (Haskell, Ruby, Python, Erlang, CoffeeScript และอีกสองสามภาษา) การเยื้องเป็นสิ่งสำคัญ ดังนั้นหากคุณกำลังเปลี่ยนขนาดตัวอักษรมันอาจยากที่จะคิดออก

ประเพณีส่วนใหญ่ ฉันเขียนโปรแกรมอย่างมืออาชีพมาเกือบ 20 ปีแล้วและสงสัยว่ามันจะทำให้ฉันบ้าคลั่ง ฉันเขียนหนังสือใน Emacs หรือ VI ด้วย docbook ดังนั้นฉันจึงไม่ใช่แฟน WYSIWIG


2

CWEB ของ Knuth ทำสิ่งนี้ แต่ใช้ได้กับ C / C ++ และ Pascal เท่านั้น - คุณควรดูมัน ... มันค่อนข้างเรียบร้อย มีสองโปรแกรมคือ: ctangleและcweaveซึ่งรวม / แยกไฟล์ CWEB ลงใน TeX และ C ตามลำดับ


1
nowebใช้ได้กับเกือบทุกภาษาที่เป็นไปได้ และยังมีระบบการเขียนโปรแกรมความรู้เฉพาะทางมากมายสำหรับภาษาอื่น ๆ อีกมากมายเช่นกัน (lhs และเหมือนกัน) บางภาษามีความสามารถในการเรียงพิมพ์นอกกรอบตั้งแต่ต้นทศวรรษ 1960 - ดูen.wikipedia.org/wiki/Stropping_(programming)
SK-logic

3
@ SK-ตรรกะ - โอ๊ยโปรดอย่าทำให้ฉันนึกถึงหนังสยองขวัญที่มีการเขียนโปรแกรมความรู้ เปลี่ยนการตรวจสอบโค้ดอย่างรวดเร็วให้กลายเป็นการตรวจสอบเอกสารที่น่าเบื่อและมีความยาวตรวจสอบการเปลี่ยนวลีทุกครั้งที่ผ่านมาและเครื่องหมายจุลภาคหายไป ทำไมบางส่วนของอุตสาหกรรมการป้องกันคิดว่านี่เป็นความคิดที่ดีที่ฉันจะไม่มีวันรู้ ฉันไม่คิดว่าบรรณาธิการ WYSIWYG จะทำให้ดีขึ้นกว่านี้
Mark Booth

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

2

คุณเคยเห็นรหัสที่มีการจัดรูปแบบมาก่อนหรือไม่หรือคุณรู้หรือไม่ว่าแนวคิดนั้นเคยถูกพิจารณาและถูกปฏิเสธในที่สุด

แน่ใจ Xcode รองรับสไตล์นอกเหนือจากการระบายสีง่าย ๆ สำหรับไวยากรณ์ที่แตกต่างกัน:

รหัสแหล่งที่มากับข้อความสไตล์

เป็นเวลานานแล้วที่ฉันใช้มัน แต่ฉันคิดว่า Metrowerks CodeWarrior สนับสนุนข้อความสไตล์เช่นกันและนั่นก็เป็นเวลา 10+ ปีที่แล้ว

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

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


1

ฉันคิดว่าการจัดรูปแบบที่สมบูรณ์ของซอร์สโค้ดนั้นไม่ได้รับความนิยมมากนักเพราะมันมีไว้สำหรับการป้อนข้อมูลซึ่งโครงสร้างและความหมายมีความสำคัญมากกว่า (และง่ายต่อการพิมพ์เช่นกัน) แบบอักษรสัญลักษณ์พิเศษพิเศษและช่องว่างสีขาวเพียงแค่เพิ่มสัญญาณรบกวนภาพที่ไม่จำเป็น อาจเหมาะสมสำหรับเอกสารที่สร้างขึ้น

ไม่มีที่สิ้นสุดสงครามเปลวไฟเกี่ยวกับหัวข้อเดียวกันในโลกเรียงพิมพ์ระหว่างผู้ที่ชอบบรรณาธิการ WYSIWYG (เช่น MS Word) และระบบเช่น TeX (LaTeX)

โดยทั่วไปไม่มีคำตอบที่ชัดเจน ทุกอย่างขึ้นอยู่กับเครื่องมือการใช้เคสและความชอบส่วนตัว


1

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

นี่ไม่ใช่ WYSIWYG แต่


0

ฉันกลัวที่จะพูดว่าสิ่งนี้มีอยู่จริง

ในอดีตที่ผ่านมาฉันเคยทำงานกับ Centura (หรือที่รู้จักกันในชื่อ Gupta หรือ SQL / Windows - รหัส " 4GL " เก่า) มันเป็นไปไม่ได้ที่จะแก้ไขรหัส Centura ในโปรแกรมแก้ไขมาตรฐานอย่างเช่น Notepad เพื่อการจัดรูปแบบในระดับสูงสุด

แม้ว่ามันอาจดูเหมือนเป็นความคิดที่ดีที่จะจัดรูปแบบไฟล์ต้นฉบับแบบนี้ แต่ฉันพบว่าการพัฒนานั้นค่อนข้างเข้มงวดและเจ็บปวด

นอกจากนี้การจัดรูปแบบมักจะทำให้เกิดปัญหาเมื่อผสานในการควบคุมแหล่งที่มา


0

นอกเหนือจากคำตอบอื่น ๆ ฉันขอชี้ให้เห็นว่านอกเหนือจากปัญหาทางเทคนิคของการใช้การจัดรูปแบบที่หลากหลายแล้วยังเป็นเป้าหมายของการตั้งค่าส่วนตัว

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


1
ฉันไม่คิดว่านี่เป็นเรื่องจริง ฉันค่อนข้างแน่ใจว่าโปรแกรมเมอร์ใช้ rich text จะมีเครื่องกำเนิดที่ทำมาร์กอัปความหมายบางอย่างที่อธิบายโครงสร้างของโปรแกรมแล้วสไตล์ชีทที่ผู้ใช้ปรับแต่งได้ซึ่งมีข้อมูลแบบอักษรและสี
Peter Olson

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

0

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

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