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

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

2
คอมไพเลอร์ใช้ประโยชน์จากมัลติเธรดเพื่อการรวบรวมที่เร็วขึ้นหรือไม่?
ถ้าฉันจำหลักสูตรคอมไพเลอร์ของฉันได้อย่างถูกต้องคอมไพเลอร์ทั่วไปมีโครงร่างที่เรียบง่ายดังต่อไปนี้: ตัววิเคราะห์คำจะสแกน (หรือเรียกใช้ฟังก์ชั่นการสแกนบางอย่าง) โค้ดต้นฉบับแบบตัวอักษรต่ออักขระ สตริงของอักขระอินพุตถูกตรวจสอบกับพจนานุกรมของ lexemes เพื่อความถูกต้อง หาก lexeme นั้นถูกต้องมันจะถูกจัดประเภทเป็นโทเค็นที่สอดคล้องกับมัน parser ตรวจสอบความถูกต้องของการรวมกันของโทเค็น; token โดยโทเค็น มันเป็นไปได้ในทางทฤษฎีหรือไม่ที่จะแบ่งซอร์สโค้ดออกเป็นควอเตอร์ คอมไพเลอร์มีตัวที่ใช้มัลติเธรดหรือไม่?

2
การตรวจสอบข้อมูล: ชั้นแยกหรือไม่?
เมื่อฉันมีข้อมูลจำนวนมากที่ต้องได้รับการตรวจสอบความถูกต้องฉันควรสร้างคลาสใหม่เพื่อวัตถุประสงค์ในการตรวจสอบความถูกต้องเพียงอย่างเดียวหรือฉันควรจะใช้การตรวจสอบความถูกต้องด้วยวิธีการหรือไม่ ตัวอย่างเฉพาะของฉันพิจารณาแม่แบบทัวร์นาเมนต์และคลาสของเหตุการณ์ / หมวดหมู่: TournamentและEventซึ่งเป็นตัวอย่างของการแข่งขันกีฬาและแต่ละทัวร์นาเมนต์มีหนึ่งหรือหลายประเภท มีทุกสิ่งที่จะตรวจสอบในชั้นเรียนเหล่านี้: ผู้เล่นควรว่างเปล่า, ไม่ซ้ำกัน, จำนวนการแข่งขันที่ผู้เล่นแต่ละคนควรเล่น, จำนวนผู้เล่นแต่ละคนมีการแข่งขัน, การแข่งขันที่กำหนดไว้ล่วงหน้าและอื่น ๆ กฎที่ซับซ้อน นอกจากนี้ยังมีบางส่วนที่ฉันต้องการตรวจสอบโดยรวมเช่นวิธีที่ชั้นเรียนทำงานร่วมกัน ตัวอย่างเช่นการตรวจสอบความถูกต้องแบบรวมPlayerสามารถทำได้ แต่ถ้าเหตุการณ์มีผู้เล่นคนเดียวกันสองครั้งนั่นเป็นข้อผิดพลาดในการตรวจสอบความถูกต้อง แล้วเรื่องนี้ล่ะ: ฉันลืมเกี่ยวกับการตรวจสอบล่วงหน้าอย่างแน่นอนเมื่อใช้ setters ของคลาสโมเดลของฉันและวิธีการที่คล้ายกันเพื่อเพิ่มข้อมูลและแทนที่จะให้คลาสการตรวจสอบจัดการแทน ดังนั้นเราจะมีบางสิ่งที่คล้ายEventValidatorกับการEventเป็นสมาชิกและvalidate()วิธีการที่ตรวจสอบความถูกต้องของวัตถุทั้งหมดรวมถึงวิธีเอกพจน์เพื่อตรวจสอบกฎของสมาชิกทั้งหมด จากนั้นก่อนที่จะสร้างอินสแตนซ์ของวัตถุที่ตรวจสอบได้ฉันจะดำเนินการตรวจสอบเพื่อป้องกันค่าที่ผิดกฎหมาย การออกแบบของฉันถูกต้องหรือไม่ ฉันควรทำอะไรที่แตกต่างออกไปไหม นอกจากนี้ฉันควรใช้บูลีนวิธีการตรวจสอบกลับ? หรือเพียงแค่โยนข้อยกเว้นถ้าการตรวจสอบล้มเหลว? ดูเหมือนว่าสำหรับฉันตัวเลือกที่ดีที่สุดคือวิธีการส่งคืนบูลีนและส่งข้อยกเว้นเมื่อวัตถุนั้นเป็นอินสแตนซ์ตัวอย่างเช่น: public Event() { EventValidator eventValidator = new EventValidator(this); if (!eventValidator.validate()) { // show error messages with methods defined in the validator throw new …
16 java  design  data  validation 

4
Microservices REST หรือ AMQP ซึ่งในกรณีนี้
ฉันได้อ่านบทความมากมายเกี่ยวกับสถาปัตยกรรมไมโครไซต์และฉันสงสัยว่าเมื่อไรที่จะใช้ AMQP หรือ REST ฉันได้อ่านว่าการเชื่อมต่อระหว่างบริการเป็นสิ่งที่ดีและ AMQP ดูเหมือนจะเป็นทางเลือกที่ดีในกรณีนี้ แต่ถ้าเราใช้ AMQP นี่หมายความว่าเราไม่จำเป็นต้องใช้ปลายทาง REST อีกต่อไป (แต่นั่นหมายความว่าเราสูญเสียแนวคิด HATEOAS) แต่ REST เป็นวิธีที่ดีในการสร้างบริการของฉันหรือไม่ เพราะฉันจะไม่ใช้จุดปลายใด ๆ ... ในกรณีใดอันหนึ่งดีกว่าอีกอัน? เมื่อใดที่ฉันควรใช้รายการใดรายการหนึ่ง

2
** kwargs antipattern หรือไม่
เรามีรหัสจำนวนมากใน codebase ภายในของเราที่เรียกว่าห้องสมุดของเราภายใน - ห้องสมุดเหล่านี้มักจะมีข้อโต้แย้งมากมาย (คิดว่า matplotlib) และรหัสของเรามักจะทำเพียงงานที่เฉพาะเจาะจงและส่ง**kwargsต่อไปยังฟังก์ชันถัดไปที่เรียกว่า เช่น: def our_method(dataframe, **kwargs): result = do_something_with_data(dataframe) external_module.draw(result, **kwargs) ในขณะที่**kwargsป้องกันไม่ให้เราทำซ้ำพารามิเตอร์ทั้งหมดในการประกาศวิธีการของเรามันยังทำให้มันทึบแสงมากซึ่งข้อโต้แย้งที่ถูกต้องเมื่อโทรour_method- ฉันต้องรู้ว่าวิธีการที่เรียกว่าซึ่งฉันมักจะไม่ต้องการที่จะรู้ คุณใช้อะไรกับเรื่องนี้?
16 python 

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

6
ทำความเข้าใจกับคำหลักแบบคงที่
ฉันมีประสบการณ์ในการพัฒนากับ Java, Javascript และ PHP ฉันกำลังอ่าน Microsoft Visual C # 2010 ทีละขั้นตอนซึ่งฉันรู้สึกว่ามันเป็นหนังสือที่ดีมากในการแนะนำคุณกับภาษา C # ฉันดูเหมือนจะมีปัญหาในการทำความเข้าใจคำหลักคงที่ จากสิ่งที่ฉันเข้าใจในตอนนี้ถ้าคลาสถูกประกาศว่าสแตติกวิธีการและตัวแปรทั้งหมดต้องเป็นแบบสแตติก วิธีการหลักเสมอเป็นวิธีการคงที่ดังนั้นในชั้นเรียนที่วิธีการหลักที่มีอยู่ตัวแปรและวิธีการทั้งหมดจะประกาศคงที่ถ้าคุณต้องเรียกพวกเขาในวิธีการหลัก นอกจากนี้ฉันได้สังเกตเห็นว่าในการเรียกวิธีการคงที่จากคลาสอื่นคุณไม่จำเป็นต้องสร้างวัตถุที่คุณสามารถใช้ชื่อคลาส แต่วัตถุประสงค์ที่แท้จริงของคำหลักคงที่คืออะไร เมื่อใดที่ฉันควรประกาศตัวแปรคงที่และวิธีการ?

3
ใบอนุญาตสำหรับฟรีแวร์ แต่แอปพลิเคชันแหล่งที่มาปิด
ฉันได้พัฒนาแอพพลิเคชั่นเรียบง่ายที่ฉันต้องการจะปล่อยให้ฟรี แต่ฉันไม่ได้วางแผนที่จะปล่อยซอร์สโค้ด ฉันต้องการให้แอปพลิเคชันพร้อมใช้งานได้อย่างอิสระ แต่ฉันไม่ต้องการให้ใครขายหรือทำวิศวกรรมย้อนกลับ MIT License ดูเรียบง่ายและสวยงาม แต่ก็อนุญาตให้ใครก็ตามขายได้ มีใบอนุญาตใดเหมาะสมกับฉันหรือฉันควรจะปรับเปลี่ยน MIT License หรือไม่

2
การใช้ DDD: ผู้ใช้และการอนุญาต
ฉันกำลังทำงานกับแอปพลิเคชันขนาดเล็กที่พยายามเข้าใจหลักการของการออกแบบที่ขับเคลื่อนด้วยโดเมน หากประสบความสำเร็จนี่อาจเป็นโครงการนำร่องสำหรับโครงการขนาดใหญ่ ฉันกำลังพยายามติดตามหนังสือ "ใช้การออกแบบโดเมนขับเคลื่อนด้วย" (โดย Vaughn Vernon) และพยายามใช้ฟอรัมสนทนาที่คล้ายกันและเรียบง่าย ฉันได้ลองดูตัวอย่าง IDDD ของ GitHub ฉันมีปัญหาในการใช้ข้อมูลประจำตัวและการเข้าถึงกรณีของฉัน ให้ฉันให้ข้อมูลพื้นหลัง: ฉัน (หวังว่า) เข้าใจเหตุผลที่อยู่เบื้องหลังการแยกผู้ใช้และตรรกะการอนุญาต: มันเป็นโดเมนที่สนับสนุนและเป็นบริบทที่แตกต่างกัน ในโดเมนหลักไม่มีผู้ใช้เพียงแค่ผู้สร้างผู้ดูแล ฯลฯ สิ่งเหล่านี้ถูกสร้างขึ้นโดยการเข้าถึงบริบทผู้ใช้และการเข้าถึงโดยใช้บริการจากนั้นจึงแปลวัตถุผู้ใช้ที่ได้รับและผู้ดูแล การดำเนินการกับโดเมนจะถูกเรียกพร้อมกับบทบาทที่เกี่ยวข้องเป็นพารามิเตอร์: เช่น: ModeratePost( ..., moderator); วิธีการของวัตถุโดเมนตรวจสอบว่าอินสแตนซ์ของโมเดอเรเตอร์ที่กำหนดไม่ใช่โมฆะ (อินสแตนซ์ของโมเดอเรเตอร์จะเป็นโมฆะถ้าผู้ใช้ที่ถามจากบริบทผู้ใช้และบริบทไม่มีบทบาทผู้ดูแล) ในกรณีหนึ่งจะทำการตรวจสอบเพิ่มเติมก่อนที่จะแก้ไขโพสต์: if (forum.IsModeratedby(moderator)) คำถามของฉันคือ: ในกรณีหลังความกังวลด้านความปลอดภัยไม่ได้รวมกันอีกครั้งในโดเมนหลัก? ก่อนหน้านี้หนังสือระบุว่า "ใครสามารถโพสต์หัวข้อหรือภายใต้เงื่อนไขที่อนุญาตฟอรั่มเพียงแค่ต้องรู้ว่าผู้แต่งกำลังทำเช่นนั้นในตอนนี้" การนำไปใช้ตามบทบาทในหนังสือเล่มนี้ค่อนข้างตรงไปตรงมา: เมื่อ Moderator เป็นโดเมนหลักพยายามแปลง userId ปัจจุบันเป็น Moderator หรือเป็นผู้เขียนเมื่อต้องการ บริการจะตอบกลับด้วยอินสแตนซ์ที่เหมาะสมหรือเป็นโมฆะหากผู้ใช้ไม่มีบทบาทที่จำเป็น อย่างไรก็ตามฉันไม่สามารถเห็นได้ว่าฉันจะปรับให้เข้ากับรูปแบบการรักษาความปลอดภัยที่ซับซ้อนมากขึ้นได้อย่างไร โครงการปัจจุบันของเราที่ฉันกำลังดำเนินการอยู่นั้นมีรูปแบบที่ค่อนข้างซับซ้อนกับกลุ่ม ACL ฯลฯ แม้จะมีกฎที่ไม่ซับซ้อนมากเช่น: "โพสต์ควรแก้ไขโดยเจ้าของหรือบรรณาธิการเท่านั้น" …

2
การย้ายฐานข้อมูลและสล็อตการปรับใช้ Azure
ฉันวางแผนที่จะส่งแอปพลิเคชันเว็บใหม่ไปยังบริการ Azure Web App (เว็บไซต์ Azure เดิม) ฉันต้องการใช้ประโยชน์จากสล็อตการปรับใช้เพื่อให้สามารถทดสอบการใช้งานของฉันก่อนที่จะผลักดันมันไปสู่การผลิต นั่นคือทั้งหมดที่ดีตราบใดที่ไม่มีการเปลี่ยนแปลง DB schema จำเป็นต้องใช้ แต่ถ้ามีการเปลี่ยนแปลงสกีมาฉันไม่สามารถมีซอฟต์แวร์เวอร์ชันสองเวอร์ชันที่ทำงานบน db เวอร์ชันเดียวกันได้ เนื่องจากฉันใช้ EF Migrations การกดไปที่สล็อตชั่วคราวจะส่งผลให้มีการอัปเดตฐานข้อมูลเป็นเวอร์ชันล่าสุดทันที ดังนั้นคำถามของฉันคือว่ามีการใช้สล็อตการปรับใช้ใด ๆ หรือไม่เมื่อต้องการโอนย้ายฐานข้อมูล ทำอย่างไรกับผู้ให้บริการ SaaS ขนาดใหญ่ พวกเขาทำการย้ายฐานข้อมูลทันทีด้วยเวอร์ชันใหม่หรือไม่ นั่นจะทำให้การหยุดทำงานของบางอย่างแน่นอน ฉันสามารถนึกถึงวิธีแก้ปัญหาที่ค่อนข้างซับซ้อนสำหรับปัญหานี้มีอะไรที่ง่ายบ้างไหม?

1
ควรจะติดแท็กสาขาที่วางจำหน่ายหรือสาขาหลักเมื่อใช้ gitflow หรือไม่
ปัญหานี้ระบุว่า: จากความเข้าใจของฉันที่วางแท็กในสาขาที่วางจำหน่ายก่อนที่จะรวม (และไม่ได้อยู่ในสาขาหลัก) ในความเป็นจริงสิ่งที่ถูกต้องที่จะทำมันสามารถพบได้โดย git อธิบาย - แท็กจากสาขาพัฒนาเช่นกัน ดู # 374 ในขณะที่โพสต์อื่น : ฉันบังเอิญติดตั้งเวอร์ชั่น 0.4.2 ล่วงหน้าผ่าน homebrew วันนี้และรู้สึกสับสนกับวิธีการติดแท็กที่ใช้งานในเวอร์ชันนั้น ก่อนหน้านี้ (เวอร์ชั่น 0.4.1) แท็กถูกสร้างขึ้นในสาขาหลักหลังจากสาขาย่อยได้รับการรวมเข้าด้วยกัน ตอนนี้ดูเหมือนว่าแท็กจะถูกสร้างขึ้นในการกระทำครั้งสุดท้ายของสาขาที่วางจำหน่ายซึ่งดูเหมือนจะไม่ใช่ความคิดที่ดีสำหรับฉัน โดยเฉพาะอย่างยิ่งถ้าคุณมีระบบการสร้างที่อาศัยแท็ก git และสร้างรุ่นที่วางจำหน่ายหาก HEAD เป็นคอมมิทที่ติดแท็กและเวอร์ชันการพัฒนาหากหนึ่งในคอมมิชชันต่อไปนี้ ใครช่วยอธิบายตรรกะที่อยู่เบื้องหลังการเปลี่ยนแปลงนี้ให้ฉันได้ไหม และด้วยความเคารพต่อ semantic versioning ฉันไม่คิดว่ามันจะเป็นเวอร์ชั่นที่ชนกันในระดับ patch! ในทีมของเราเรามีและมีการพูดคุยกันหลายครั้งเกี่ยวกับเรื่องนี้ บางคนระบุว่าจะต้องสร้างแท็กจากสาขาหลักในขณะที่บางสาขาต้องการสาขาย่อย ตามภาพ gitflow: ดูเหมือนว่าแท็กจะถูกวางไว้บนต้นแบบ
16 gitflow 

3
พฤติกรรมการทดสอบหน่วยโดยไม่ต้องเชื่อมต่อกับรายละเอียดการใช้งาน
ในการพูดคุยของเขาTDD มันผิดพลาดที่ไหนเอียนคูเปอร์ผลักดันความตั้งใจดั้งเดิมของเบ็คเบ็คหลังการทดสอบหน่วยใน TDD (เพื่อทดสอบพฤติกรรม ในกรณีของพฤติกรรมเช่นsave X to some data sourceในระบบที่มีชุดบริการและที่เก็บทั่วไปเราจะทดสอบการบันทึกข้อมูลบางอย่างในระดับการบริการผ่านที่เก็บโดยไม่ต้องเชื่อมต่อการทดสอบกับรายละเอียดการใช้งาน (เช่นการเรียกวิธีการเฉพาะ )? การหลีกเลี่ยงการมีเพศสัมพันธ์แบบนี้จริง ๆ แล้วไม่คุ้มค่าความพยายาม / ไม่ดีในบางวิธี?

2
จะแสดงชุดใน JSON อย่างไร
JSON สนับสนุนโครงสร้างข้อมูลต่อไปนี้ (เทียบเท่า Java): Scalar, Array / List และ Map A Setไม่รองรับ out-of-the-box ใน JSON ฉันคิดหลายวิธีในการเป็นตัวแทนของชุดใน JSON: [1] - เป็นรายการ อย่างไรก็ตามรายการมีลำดับของตัวเองดังนั้นสองรายการต่อไปนี้["a", "b"]และ["b", "a"]ไม่เท่ากับรายการ แต่พวกเขาควรจะเท่ากับชุด [2] - เป็นแผนที่ ใช้ชุดคีย์ของแผนที่และละเว้นค่า แต่อีกครั้งโดยใช้การเปรียบเทียบแบบมาตรฐานทั้งสองแบบไม่เหมือนกับแผนที่: {"a": "foo", "b": "bar"}, {"a": null, "b": null} [3] - เป็นแผนที่ที่มีค่าพิเศษ ใช้สเกลาร์พูด0หรือnullบังคับให้มันเป็นค่าของทุกคีย์ในแผนที่: {"a": 0, "b": 0} ด้วยวิธีนี้ภายใต้เครื่องมือเปรียบเทียบมาตรฐานวัตถุจะเท่ากันแม้ว่าจะเปลี่ยนการเรียงลำดับคีย์ อย่างไรก็ตามเทคนิคนี้สร้างมลภาวะเอกสาร JSON ด้วยข้อมูลที่ไม่เกี่ยวข้อง [4] …

3
แอปพลิเคชันผู้เช่าหลายคนคืออะไร
ตามคำจำกัดความที่มีออนไลน์คือ " Multi-tenancy เป็นสถาปัตยกรรมที่อินสแตนซ์เดียวของแอปพลิเคชันซอฟต์แวร์ให้บริการลูกค้าหลายราย " หมายถึงฉันมีเว็บไซต์ร้านอาหารหรือโรงเรียนและฉันให้การเข้าถึงร้านอาหารหรือโรงเรียนต่าง ๆ เพื่อใช้แอปพลิเคชันของฉันกับข้อมูลของตัวเองโดยใช้ข้อมูลประจำตัวของพวกเขาที่ฉันให้เมื่อพวกเขาซื้อผลิตภัณฑ์การจัดการโรงเรียน เช่นเดียวกับเว็บไซต์ของฉันเหมือนschoolmanagement.comและฉันมอบโดเมนย่อยที่แตกต่างให้กับลูกค้าโรงเรียนต่าง ๆ เช่นschool1.schoolmanagement.com & school2.schoolmanagement.comแต่รหัสนั้นเหมือนกันทั้งสองโดเมนย่อยเหล่านี้ โรงเรียนทั้งสองแห่งมีฟังก์ชั่นหรือธีมที่แตกต่างกันขึ้นอยู่กับฐานข้อมูลแยก ดังนั้นฉันต้องให้schoolmanagement.comเพื่อเข้าสู่ระบบและเมื่อเข้าสู่ระบบของลูกค้าของพวกเขาขึ้นอยู่กับการเข้าสู่ระบบการรับรองฉันเปลี่ยนเส้นทางไปยัง URL ของตนเช่นschool1.schoolmanagement.com นี่คือความเข้าใจของฉันเกี่ยวกับแอปพลิเคชันผู้เช่าหลายคน ความเข้าใจของฉันถูกต้องหรือไม่ มีแอปพลิเคชั่นหลายผู้เช่าออนไลน์ที่ฉันสามารถผ่านได้

4
ขั้นตอนการใช้งานซอฟแวร์สำหรับ One Man Teams [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการถกเถียงโต้แย้งโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา ฉันกำลังสร้างระบบซอฟต์แวร์สำหรับโครงการปริญญาโทของฉันและกำลังมองหาคำแนะนำเกี่ยวกับวิธีการเฉพาะที่เหมาะสมกับ "ทีมชายคนหนึ่ง" ...

6
วิธีใช้การแฮชแบบลอยด้วยความเท่าเทียมกันโดยประมาณ
สมมติว่าเรามีคลาส Python ดังต่อไปนี้ (ปัญหามีอยู่ใน Java เช่นเดียวกับequalsและhashCode) class Temperature: def __init__(self, degrees): self.degrees = degrees ที่degreesเป็นอุณหภูมิเคลวินเป็นลอยที่ ตอนนี้ฉันต้องการที่จะใช้การทดสอบความเท่าเทียมกันและ hashing Temperatureในทางที่ เปรียบเทียบลอยขึ้นกับความแตกต่าง epsilon แทนการทดสอบความเท่าเทียมกันโดยตรง และได้รับเกียรตินิยมสัญญาว่าหมายถึงa == bhash(a) == hash(b) def __eq__(self, other): return abs(self.degrees - other.degrees) < EPSILON def __hash__(self): return # What goes here? เอกสาร Python พูดถึงตัวเลขการแฮชเล็กน้อยเพื่อให้แน่ใจว่าhash(2) == hash(2.0)นี่ไม่ใช่ปัญหาเดียวกัน ฉันยังอยู่ในเส้นทางที่ถูกต้องหรือไม่? และถ้าเป็นเช่นนั้นวิธีมาตรฐานในการใช้การแฮชในสถานการณ์นี้คืออะไร? ปรับปรุง …

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