วิศวกรรมซอฟต์แวร์

ถาม - ตอบสำหรับมืออาชีพนักวิชาการและนักเรียนที่ทำงานในวงจรการพัฒนาระบบ

1
Java 8: วิธีปฏิบัติที่ดีในการส่งผ่านสตรีมใน API สำหรับการดำเนินการที่ไม่ราบรื่นหรือไม่
ในไลบรารี pre-Java 8 lambda-heavy เช่น Guava เอาต์พุตใช้อินเตอร์เฟส Java Collection Framework ทั่วไปดังนั้นจึงง่ายต่อการส่งไปยัง API ภายนอก / ภายในและยังคงควบคุมการคำนวณแบบสันหลังยาวหากวิธีไลบรารีทำเช่นนั้น (ขี้เกียจfilter()และtransform()) อย่างไรก็ตามใน Java 8 Streams การเรียกรับ a Collection/ Mapis terminal (เช่นกระตือรือร้น) และจะจัดสรรโครงสร้างข้อมูลใหม่เพื่อเก็บผลลัพธ์ สำหรับการคำนวณที่ซับซ้อนที่มีหลายขั้นตอนและรูปแบบกลยุทธ์อยู่ตรงกลางสิ่งนี้ทำให้เกิดการจัดสรรที่ไม่จำเป็นจำนวนมากเนื่องจากผลลัพธ์ระดับกลาง ดังนั้นผู้คนคิดว่าเป็นวิธีปฏิบัติที่ดีสำหรับ API ภายใน (เช่นกลยุทธ์รูปแบบกลยุทธ์) ในการรับและส่งคืนStreamหรือฉันควรย้อนกลับไปยังคนขี้เกียจ แต่ไม่คล่องตัว (คิดว่าฉันเดา) API ของ Guava แก้ไข: ความกังวลหลักของฉันStreamคือมันสามารถบริโภคได้เพียงครั้งเดียวและผ่านบางสิ่งบางอย่างเช่นSupplier<Stream<X>>ดูยุ่งยากมาก มันเกือบจะผลักดันให้คุณเพิ่งผ่านCollectionและกลับมาอีกครั้งstream()(และจ่ายค่าใช้จ่ายในการประเมินความกระตือรือร้นที่จุดนั้น)
12 java  lambda 

2
อัลกอริธึมมาบรรจบกันหมายความว่าอะไร?
ฉันเจอคำศัพท์นี้ตลอดเวลาเมื่ออ่านเกี่ยวกับการเรียนรู้การเสริมแรงเช่นในประโยคนี้: หากปัญหานั้นเป็นแบบอย่างด้วยความระมัดระวังอัลกอริธึมการเรียนรู้การเสริมแรงบางอย่างสามารถมาบรรจบกันเพื่อให้เกิดประโยชน์สูงสุดในระดับโลก http://reinforcementlearning.ai-depot.com/ หรือที่นี่: สำหรับนโยบายคงที่ Pi ใด ๆ อัลกอริทึม TD ที่อธิบายไว้ข้างต้นได้รับการพิสูจน์แล้วว่ามาบรรจบกับ VPi http://webdocs.cs.ualberta.ca/~sutton/book/ebook/node62.html ความเข้าใจของฉันเกี่ยวกับคำว่ามาบรรจบกันก็คือมันหมายถึงหลายสิ่งที่มารวมกันในจุดเดียวกัน แต่สิ่งเดียว (อัลกอริทึม) จะทำเช่นนั้นได้อย่างไร?

1
การจัดทำดัชนีอย่างรวดเร็วของชุดค่าผสม k
ฉันกลับมาทบทวนปัญหาเก่าที่เคยทำมาก่อนหน้านี้แล้ว สถานการณ์ทั่วไปคือ "3 บิตตั้งอยู่ภายในจำนวนเต็ม 8 บิต" เช่น 00000111 ชุดค่าผสมที่ไม่ซ้ำกันทั้งหมดที่มี 3 ชุดบิตสามารถสร้างได้ง่าย (ตามลำดับ) โดยลูปซ้อนกัน สิ่งที่ฉันสนใจคือชุดค่าดัชนีการแม็พ <-> เช่น "00001011" จะเป็นชุดค่าผสมที่สอง (หรือค่า "1" ในดัชนีแบบ zero-based) จนถึงตอนนี้ฉันวิ่งผ่านชุดค่าผสมทั้งหมดและเก็บไว้ในตารางทำดัชนีค้นหา -> การสนทนาเป็นการดำเนินการ O (1) อีกทางหนึ่งคือ O (ln (n)) ด้วยการค้นหาแบบแบ่งครึ่ง ข้อเสียคือความชัดเจนในเรื่องนี้ถ้าเราเพิ่มโดเมนจนถึงจุดที่ไม่สามารถทำได้ อะไรจะเป็นวิธีง่ายๆในการคำนวณชุดค่าผสม n.th หรือดัชนีสำหรับชุดค่าผสมที่กำหนด ลำดับของการรวมกันจะดี แต่ไม่บังคับ

2
การอนุญาตของผู้ใช้ด้วย microservices
microservices ควรรับผิดชอบในการจัดการการอนุญาตของตนเองหรือคุณคิดว่าจะดีกว่าที่จะมีการให้บริการการอนุญาตแยกต่างหากที่ใช้ร่วมกันในทุกส่วนย่อย (ภายในโดเมนธุรกิจเดียวกัน) ของ microservices สำหรับฉันแล้วมันมีเหตุผลมากกว่าที่จะทำให้ง่ายต่อการใช้การเปลี่ยนแปลงบังคับใช้นโยบาย เป็น DRY เป็นต้นอย่างไรก็ตามสามารถออกจากมือได้อย่างง่ายดายด้วยบริการทุกประเภทที่ทิ้งกฎไว้ในที่เดียวและยังกังวลเกี่ยวกับค่าใช้จ่ายของเครือข่าย ความคิดใด ๆ

3
ใช้“ สิ่งนี้” ใน Golang
สิ่งที่ใกล้เคียงที่สุดของ Golang ก็คือคู่มือสไตล์ที่พบได้ที่นี่ภายใต้ชื่อผู้รับข้อความที่เขียนนี้: ชื่อของวิธีการรับควรสะท้อนถึงตัวตนของมัน มักจะเป็นตัวย่อหนึ่งหรือสองตัวอักษรของประเภทพอเพียง (เช่น "c" หรือ "cl" สำหรับ "ลูกค้า") อย่าใช้ชื่อสามัญเช่น "ฉัน", "สิ่งนี้" หรือ "ตัวเอง", ตัวบ่งชี้ทั่วไปของภาษาเชิงวัตถุที่ให้ความสำคัญกับวิธีการที่ต่างจากฟังก์ชัน ชื่อไม่จำเป็นต้องมีความหมายเหมือนกับอาร์กิวเมนต์ของเมธอดเนื่องจากบทบาทนั้นชัดเจนและไม่มีวัตถุประสงค์ด้านเอกสาร โดยส่วนตัวฉันมักจะใช้ "นี่" เป็นตัวระบุเสมอเพราะ "นี่" คือจุดสำคัญของสิ่งที่ฉันกำลังทำงานเมื่อฉันเขียนและแก้ไขฟังก์ชั่น มันฟังดูดีและ (สำหรับฉันอย่างน้อย) มันสมเหตุสมผล หากชื่อนั้นไม่จำเป็นต้องอธิบายความหมายของบทบาทนั้นชัดเจนและไม่มีจุดประสงค์ในการทำสารคดีทำไมจึงต้องใช้ "เรื่องนี้" เพื่อขมวดคิ้ว?

2
วาดกราฟการโทร
ฉันยังคงรักษาฐานรหัสเก่าที่เขียนด้วยไพ ธ อน โดยเฉพาะอย่างยิ่งมีชิ้นส่วนที่ซับซ้อนของรหัสที่มาจากโมดูลเรียกฟังก์ชั่นอื่น ๆ จากโมดูลอื่นที่เรียกใช้ฟังก์ชั่นอื่น ๆ และอื่น ๆ ไม่ใช่ OOP เพียงฟังก์ชั่นและโมดูล ฉันพยายามติดตามว่าการไหลเริ่มต้นและสิ้นสุดเมื่อใดฉันเรียกฟังก์ชันหลัก แต่ฉันรู้สึกว่าต้องวาดสิ่งนี้เพราะฉันหลงทางในการโทรย่อย สิ่งที่ฉันกังวลก็คือแต่ละฟังก์ชั่นเรียกฟังก์ชั่นภายนอกหลายอย่างภายในร่างกายของพวกเขาเพื่อทำงานให้เสร็จและส่งคืนค่าให้กับผู้โทร ฉันจะวาดสิ่งนี้ได้อย่างไร ความหมายของแผนภูมิ / กราฟิกประเภทใดที่เหมาะกับการบันทึกพฤติกรรม / รหัสประเภทนี้ ดังนั้นฉันไม่คิดว่าจะมีประโยชน์ในการวาดแผนภาพ UML ไม่ใช่ผังงาน กราฟการโทรอาจจะใช่ไหม

1
ตัวควบคุม Async ใน ASP.NET MVC: ข้อดีจริง / เป็นอย่างไร
ฉันทำงานผ่านบทความเกี่ยวกับวิธีการควบคุมแบบอะซิงโครนัสใน ASP.NET MVC ( http://visualstudiomagazine.com/articles/2013/07/23/async-actions-in-aspnet-mvc-4.aspx ) และฉันคิดว่า ฉันอาจจะพลาดจุดนี้ ลองใช้วิธีนี้ที่ฉันเขียนซึ่งคล้ายกับตัวอย่างจากบทความ: [HttpGet] [AsyncTimeout(8000)] [HandleError(ExceptionType = typeof(TimeoutException), View = "TimedOut")] public async Task<ActionResult> Index(CancellationToken cancellationToken) { WidgetPageViewModel model = new WidgetPageViewModel() { toAdd = new Widget() }; model.all = await _repo.GetAllAsync(cancellationToken); return View(model); } เมื่อฉันเข้าใจสิ่งต่าง ๆ นี่คือสิ่งที่จะเกิดขึ้นในรันไทม์: เธรด ASP.NET จะถูกสร้างขึ้นสำหรับคำขอ HTTP ขาเข้า หัวข้อนี้จะ …

2
อะไรคือความสัมพันธ์ระหว่างขอบเขตและเนมสเปซใน Python
ในแหล่งข้อมูลมากมายฉันพบว่า"ขอบเขต"และ"เนมสเปซ"ถูกใช้แทนกันได้ซึ่งดูเหมือนว่าจะสับสนเล็กน้อยเนื่องจากมันหมายถึงสิ่งที่แตกต่างกัน ขอบเขตกำหนดขอบเขตของรหัสที่มีชื่อ กฎ LEGB กำหนดวิธีค้นหาชื่อ Namespace เป็นสถานที่ที่คุณค้นหาชื่อ จากนั้นฉันก็อ่าน: "ชื่อถูกผูกไว้กับ namespace ตามที่พวกเขาได้รับมอบหมาย ... " (ซึ่งฉันเชื่อว่าเป็นข้อตกลงกับขอบเขตในการกำหนดขอบเขตคำศัพท์) "ฟังก์ชั่นเพิ่มเนมสเปซเลเยอร์พิเศษให้กับโปรแกรมของคุณ" [ อ้างอิง ] (พวกเขาไม่ได้เพิ่มขอบเขตในพื้นที่พิเศษหรือไม่) "ชื่อทั้งหมดที่กำหนดภายในนิยามฟังก์ชั่นจะอยู่ในขอบเขตภายใน (เนมสเปซที่เกี่ยวข้องกับการเรียกใช้ฟังก์ชัน)" "โกลบอลสโคป - กล่าวคือเนมสเปซซึ่งตัวแปรสร้างขึ้น (กำหนด) ที่ระดับบนสุดของไฟล์โมดูลอยู่" * ราคาทั้งหมดมาจากการเรียนรู้ python 5th edition ch17 เนมสเปซใน Python เป็นการนำไปใช้กับขอบเขตหรือไม่ พวกเขาเหมือนกันหรือไม่ มีใครสอนฉันได้ไหม
12 python 

2
เครื่องหมายสกาล่ามัด
เป็นไปได้ไหมที่จะเรียกใช้เมธอดโดยใช้รูปแบบ infix? ตัวอย่างเช่นใน Haskell ฉันสามารถเขียนฟังก์ชันต่อไปนี้: x `isAFactorOf` y = x % y == 0 แล้วใช้มันเช่น: if 2 `isAFactorOf` 10 ... ซึ่งในบางกรณีอนุญาตให้อ่านรหัสได้มาก มีอะไรคล้ายกับที่เป็นไปได้ใน Scala หรือไม่ ฉันค้นหาคำว่า "Scala infix notation" แต่คำนั้นดูเหมือนจะหมายถึงบางสิ่งที่แตกต่างใน Scala
12 scala 

2
ความแตกต่างระหว่างตัวแปรวัตถุ uninitialized และตัวแปรวัตถุเริ่มต้นเป็นโมฆะใน Java คืออะไร
ฉันมีตัวแปรออบเจคต์สองตัวต่อไปนี้ Date a; Date b=null; แน่นอนทั้ง 'a' และ 'b' ไม่ได้อ้างอิงถึงวัตถุใด ๆ ตอนนี้ถ้าฉันเรียกใช้คำสั่งต่อไปนี้ System.out.println(a.toString()); จะมีข้อผิดพลาดเวลารวบรวมขณะที่ถ้าฉันเรียกใช้คำสั่งต่อไปนี้ System.out.println(b.toString()); จะไม่มีข้อผิดพลาดเวลารวบรวม แต่จะมีข้อผิดพลาดรันไทม์ อะไรคือสาเหตุของสิ่งนี้และค่าใดที่จะถูกเก็บไว้ใน 'b' เพื่อแทนค่า Null?
12 java 

7
OOP พัฒนาขึ้นอย่างไรเพื่อรวมแนวคิดของ Properties
ฉันมาจากพื้นหลัง C ++ และหมดทุกอย่าง C # ในงานปัจจุบันของฉันและฉันเพิ่งอ่านคำถามมากมายเกี่ยวกับความแตกต่างระหว่างฟิลด์สาธารณะและคุณสมบัติและสิ่งที่แตกต่างและกลับมาในรูปแบบนี้ คำถามพื้นฐาน (เช่นโพสต์ SO นี้และคำถามที่เชื่อมโยงทั้งหมดที่เกี่ยวข้อง) คำถามทั้งหมดเหล่านี้ได้รับการแก้ไขในแง่ของความแตกต่างในทางปฏิบัติที่ได้รับการมีอยู่ของระบบทรัพย์สิน แต่ฉันคิดว่ามันเป็นการดีที่จะเข้าใกล้เรื่องนี้ในแง่ของสิ่งที่นักออกแบบของทุกภาษาที่ตัดสินใจสนับสนุนคุณสมบัติในครั้งแรก สถานที่กำลังคิด (ตรวจสอบรายชื่อในบทความ Wikipedia ที่นี่) OOP วิวัฒนาการมาจาก C ++ / Java เพื่อขยายสู่บทความ Wikipedia ที่น่าสนใจว่าเป็นตัวกลางระหว่างวิธีการและข้อมูลสมาชิกอย่างไร "นั่นคือคุณสมบัติจะอยู่ตรงกลางระหว่างรหัสสมาชิก (วิธีการ) และข้อมูลสมาชิก (ตัวแปรอินสแตนซ์) ของคลาสและคุณสมบัติให้ระดับการห่อหุ้มที่สูงกว่าเขตข้อมูลสาธารณะ" MSDNเพิ่มพื้นหลังเพิ่มเติม: "แม้ว่าคุณสมบัติจะคล้ายกันกับวิธีการทางเทคนิค แต่ก็แตกต่างกันมากในแง่ของสถานการณ์การใช้งานพวกเขาควรมองว่าเป็นสมาร์ทฟิลด์พวกเขามีการเรียกไวยากรณ์ของฟิลด์และความยืดหยุ่นของเมธอด" ฉันอยากจะรู้ว่ามันมาถึงแล้วในระดับปานกลางของการห่อหุ้มที่พิสูจน์แล้วว่ามีประโยชน์สำหรับการเขียนโปรแกรมโดยทั่วไป ฉันสมมติว่าแนวคิดนี้ไม่ได้เกิดขึ้นในการเขียนโปรแกรมภาษาแรกที่แสดงกระบวนทัศน์ OOP

4
ทำไมการใช้ conjunctions ในเมธอดจึงตั้งชื่อแผนการประชุมที่ไม่ดี? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ในทีมของฉันเราทำงานอย่างใกล้ชิดกับสถาปนิกซอฟต์แวร์เพียงไม่กี่คน พวกเขาอนุมัติการตัดสินใจการออกแบบทั้งหมดของโครงการของเราทำการทบทวนโค้ด ฯลฯ โครงการของเราประกอบด้วยฟังก์ชันแบ็คเอนด์ส่วนใหญ่ที่ใช้ใน PHP โดยใช้เฟรมเวิร์ก Symfony 2 ดังนั้น syntactically รหัส, การตั้งชื่อแบบแผนและโครงสร้างโครงการดูเหมือนเกือบจะเหมือนกับสิ่งที่ Java จะมีลักษณะ (Symfony 2 สนับสนุนโครงสร้างดังกล่าว) ฉันกำลังพูดถึงเรื่องนี้เพราะอนุสัญญาเฉพาะ Java ยังใช้ในกรณีของเรา (ถ้าเป็นไปได้) เมื่อเร็ว ๆ นี้พวกเขาชี้ให้เห็นบางสิ่งบางอย่างที่ผมพบที่แปลกมาก: วิธีการทั้งหมดที่ควรจะมีในสันธานเช่นชื่อของพวกเขาgetEntityOrNull, setValueOrExceptionฯลฯ การตั้งชื่อแบบนี้รู้สึกผิดกับฉันมาก แต่ฉันไม่สามารถหาข้อโต้แย้งที่เป็นรูปธรรมหรือบทความ / หน้าเว็บออนไลน์ที่ท้าทายเรื่องนี้โดยเฉพาะได้ สิ่งเดียวที่ฉันคิดไว้คือ: ข้อมูลดังกล่าวควรมีอยู่ในคำอธิบายประกอบของวิธีเช่น@returnหรือ@throws การใช้คำสันธาน ("และ", "หรือ" ฯลฯ ) ในชื่อวิธีมักจะแนะนำว่าหลักการความรับผิดชอบเดี่ยวไม่ได้รับการเคารพอย่างเหมาะสม อะไรคือข้อโต้แย้งที่เป็นรูปธรรมอื่น ๆ ต่ออนุสัญญาการตั้งชื่อนี้

2
ในแง่ของคนธรรมดาเรียกซ้ำคืออะไร?
ตามหน้าหนึ่งใน code.google.com มีการกำหนด "การเรียกซ้ำแบบด้านซ้าย" ดังนี้: การเรียกซ้ำทางซ้ายเพียงอ้างถึงการเรียกซ้ำที่ไม่ได้กำหนดว่าเมื่อมันสร้างรูปแบบประโยคที่มีตัวมันเองสำเนาใหม่ของตัวเองจะปรากฏขึ้นที่ด้านซ้ายของกฎการผลิต Wikipediaมีคำจำกัดความที่แตกต่างกันสองแบบ: ในแง่ของไวยากรณ์ที่ไม่ใช้บริบทเทอร์มินัล r จะไม่เกิดซ้ำถ้าสัญลักษณ์ซ้ายสุดในโปรดักชั่นใด ๆ ของ r (ทางเลือก ') ไม่ว่าจะในทันที คำจำกัดความ (ทางอ้อม / ซ่อนซ้ายซ้ำ) เขียนซ้ำเพื่อ r อีกครั้ง "ไวยากรณ์ซ้ำซากถ้าเราสามารถหาเทอร์มินัล A บางอันซึ่งในที่สุดจะได้รับแบบฟอร์มประโยคด้วยตัวมันเองเป็นสัญลักษณ์ซ้าย" ฉันเพิ่งจะเริ่มต้นด้วยการสร้างภาษาที่นี่และฉันทำมันในเวลาว่าง อย่างไรก็ตามเมื่อมาถึงการเลือกตัวแยกวิเคราะห์ภาษาไม่ว่าตัวแยกวิเคราะห์นี้จะสนับสนุนตัวแยกวิเคราะห์ซ้ำหรือไม่หรือตัวแยกวิเคราะห์นั้นเป็นปัญหาที่เกิดขึ้นทันทีด้านหน้าและกึ่งกลาง การค้นหาคำเช่น "รูปแบบประโยค" นำไปสู่รายการศัพท์แสงต่อไปเท่านั้น แต่ความแตกต่างของการเรียกซ้ำแบบ "ซ้าย" เกือบจะต้องเป็นสิ่งที่ง่ายมาก กรุณาแปล

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

3
บริบทคำขอทั่วโลก - รูปแบบต่อต้าน?
ฉันได้พูดคุยกับเพื่อนร่วมงานของฉันในวันนี้เกี่ยวกับโครงร่างเว็บของ Python และความประทับใจของเราที่มีต่อพวกเขา ฉันบอกเขาว่าฉันคิดว่า Flask ที่มีคำขอทั่วโลกมีกลิ่นไม่ดีและเป็นรูปแบบการต่อต้าน เอกสารพูดเกี่ยวกับบริบทคำขอ: ในทางตรงกันข้ามระหว่างการจัดการคำขอมีกฎอื่นอยู่สองข้อ: ในขณะที่คำขอใช้งานอยู่วัตถุบริบทท้องถิ่น (flask.request และอื่น ๆ ) ชี้ไปที่คำขอปัจจุบัน รหัสใด ๆ สามารถถือวัตถุเหล่านี้ได้ตลอดเวลา ฉันคิดว่าฉันเข้าใจแนวคิดเบื้องหลังการตัดสินใจออกแบบนี้ - เพื่อทำให้แอปพลิเคชันง่ายขึ้น เป็นเพียงการประนีประนอมเช่นในกรณีของThread Locals : ใช่มันไม่ใช่ความคิดที่สดใสในการใช้เธรดท้องถิ่น พวกเขาทำให้เกิดปัญหาสำหรับเซิร์ฟเวอร์ที่ไม่ได้ขึ้นอยู่กับแนวคิดของเธรดและทำให้แอปพลิเคชันขนาดใหญ่ยากต่อการบำรุงรักษา อย่างไรก็ตาม Flask ไม่ได้ออกแบบมาสำหรับแอพพลิเคชั่นขนาดใหญ่หรือเซิร์ฟเวอร์แบบอะซิงโครนัส Flask ต้องการทำให้รวดเร็วและง่ายต่อการเขียนเว็บแอปพลิเคชันแบบดั้งเดิม การแพตช์ออบเจกต์โกลบอลกับข้อมูลการร้องขอปัจจุบันเป็นรูปแบบการต่อต้านหรือไม่? ฉันเชื่อว่าเป็นเพราะอยู่ในมุมมองของวิเคราะห์รหัสคงที่ทั่วโลกแม้ว่ามันจะไม่ และฉันในฐานะโปรแกรมเมอร์จะไม่เข้าใจวิธีการทำงานโดยไม่อ่านเอกสารอย่างละเอียด และนี้มีผลกระทบในการทดสอบ เป็นการดีที่จะส่งคำขอเป็นอาร์กิวเมนต์เพื่อดู ฉันคิดว่าสามารถอ่านได้ชัดเจนและง่ายขึ้นในการดีบัก และหลีกเลี่ยงสถานะโลก

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