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

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

1
การทดสอบการรวมในโครงการ OSS - วิธีจัดการกับบุคคลที่สามด้วยการรับรองความถูกต้อง?
หนึ่งในโปรเจ็กต์อดิเรก (โอเพ่นซอร์ส) ของฉันคือเครื่องมือสำรองซึ่งทำให้การสำรองข้อมูลออฟไลน์ของที่เก็บจาก GitHub, Bitbucket เป็นต้น มันเรียก API ของ hosters เพื่อรับรายการที่เก็บข้อมูล ดึงที่เก็บไปยังเครื่องคอมพิวเตอร์ ดังนั้นฉันจึงมีการทดสอบการรวมที่ฉันเรียก GitHub API ด้วยการตรวจสอบ (และเมื่อคุณสมบัติการโคลน / ดึงเสร็จอาจมีการทดสอบว่าที่เก็บโคลนจาก GitHub และต้องรับรองความถูกต้องด้วย) ฉันสร้างผู้ใช้และองค์กรโดยเฉพาะสำหรับใช้ในการทดสอบการรวมกลุ่มเหล่านี้ ปัญหา: ฉันไม่สามารถเข้ารหัสรหัสผ่านที่ยากที่ไหนสักแห่งในซอร์สโค้ดได้เนื่องจากเป็นโอเพ่นซอร์สและรหัสนั้นเป็นสาธารณะใน GitHub สิ่งที่ฉันทำตอนนี้ ในการทดสอบฉันได้รับชื่อผู้ใช้รหัสผ่านและชื่อที่เก็บจากตัวแปรสภาพแวดล้อมทั้งหมด นี่คือตัวอย่าง : config.Name = TestHelper.EnvVar("GithubApiTests_Name"); config.Password = TestHelper.EnvVar("GithubApiTests_PW"); ( TestHelper.EnvVarเป็นวิธีตัวช่วยซึ่งรับค่าของตัวแปรสภาพแวดล้อมและส่งข้อยกเว้นเมื่อไม่มีอยู่) จากนั้นฉันมีไฟล์แบตช์ซึ่งตั้งค่าตัวแปรสภาพแวดล้อมเหล่านั้น ตัวจริง ( environment-variables.bat) เรียกในสคริปต์สร้างของฉันและก่อนที่จะดำเนินการทดสอบ แต่ละเว้นในการควบคุมแหล่งที่มาดังนั้นจึงไม่ได้อยู่ในที่เก็บจริงของฉัน สิ่งที่อยู่ในการควบคุมแหล่งที่มาenvironment-variables.bat.sampleซึ่งตั้งค่าตัวแปรสภาพแวดล้อมเดียวกัน แต่ใช้รหัสผ่านปลอม: rem copy/rename this file to …

2
อินเทอร์เฟซที่มีเพียง getters เป็นกลิ่นรหัส
(ฉันเคยเห็นคำถามนี้แต่คำตอบแรกเป็นเรื่องเกี่ยวกับคุณสมบัติอัตโนมัติมากกว่าเกี่ยวกับการออกแบบและคำตอบที่สองบอกว่าซ่อนรหัสการจัดเก็บข้อมูลจากผู้บริโภคซึ่งฉันไม่แน่ใจว่าเป็นสิ่งที่ฉันต้องการ / รหัสของฉันทำ ดังนั้นฉันต้องการฟังความเห็นอื่น ๆ ) ฉันมีเอนทิตีที่คล้ายกันมากสองรายการHolidayDiscountและRentalDiscountนั่นคือส่วนลดที่มีความยาวเนื่องจาก 'ถ้าอย่างน้อยที่สุดจะnumberOfDaysใช้percentส่วนลดได้' ตารางมี fks ไปยังเอนทิตีพาเรนต์ที่แตกต่างกันและใช้ในสถานที่ต่าง ๆ แต่ที่ที่ใช้จะมีตรรกะทั่วไปเพื่อรับส่วนลดสูงสุดที่เกี่ยวข้อง ตัวอย่างเช่น a HolidayOfferมีจำนวนHolidayDiscountsและเมื่อคำนวณต้นทุนเราต้องหาส่วนลดที่เกี่ยวข้อง RentalDiscountsเหมือนกันสำหรับเช่าและ เนื่องจากตรรกะเหมือนกันฉันต้องการเก็บไว้ในที่เดียว นั่นคือสิ่งที่วิธีต่อไปนี้เพรดิเคตและตัวเปรียบเทียบทำ: Optional<LengthDiscount> getMaxApplicableLengthDiscount(List<LengthDiscount> discounts, int daysToStay) { if (discounts.isEmpty()) { return Optional.empty(); } return discounts.stream() .filter(new DiscountIsApplicablePredicate(daysToStay)) .max(new DiscountMinDaysComparator()); } public class DiscountIsApplicablePredicate implements Predicate<LengthDiscount> { private final long daysToStay; public DiscountIsApplicablePredicate(long …

1
สไตล์การทำงานมีประโยชน์อย่างไรกับการล้อเลียนอ้างอิง
จากการสัมภาษณ์กับ Kent Beck ในนิตยสาร Java Magazine ฉบับล่าสุด: Binstock: มาพูดคุยเรื่องไมโครไซต์ สำหรับฉันดูเหมือนว่าการทดสอบครั้งแรกเกี่ยวกับบริการไมโครซอฟท์จะซับซ้อนในแง่ที่ว่าบริการบางอย่างเพื่อให้สามารถทำงานได้จะต้องมีบริการอื่น ๆ ทั้งหมด คุณเห็นด้วยหรือไม่? เบ็ค: ดูเหมือนว่าชุดการค้าขายเดียวกันกับการมีชั้นเรียนใหญ่ ๆ Binstock: ใช่ฉันเดาว่าที่นี่คุณต้องใช้ mocks จำนวนมากเพื่อให้สามารถตั้งค่าระบบที่คุณสามารถทดสอบบริการที่กำหนดได้ เบ็ค: ฉันไม่เห็นด้วย หากอยู่ในรูปแบบที่จำเป็นคุณต้องใช้ mocks มาก ในรูปแบบการใช้งานที่มีการรวบรวมการพึ่งพาจากภายนอกเข้าด้วยกันในระดับสูงขึ้นในห่วงโซ่การโทรฉันไม่คิดว่ามันจำเป็น ฉันคิดว่าคุณสามารถได้รับความครอบคลุมมากจากการทดสอบหน่วย เขาหมายถึงอะไร สไตล์การทำงานจะช่วยปลดปล่อยคุณจากการล้อเลียนการพึ่งพาจากภายนอกได้อย่างไร?

3
วิธีการออกแบบแอปพลิเคชันที่มีความพร้อมใช้งานสูง
ขณะนี้เรามีแอปพลิเคชันระดับ n คลาสสิก: DB / บริการเว็บ / ส่วนหน้า มันมีส่วนประกอบอื่น ๆ แต่มันเป็นเค้าโครงพื้นฐาน เราต้องการปรับปรุงความพร้อมใช้งานของแอปพลิเคชันด้วยเหตุผลหลัก 3 ข้อ: โฮสต์ของเราบางครั้งประสบปัญหาขัดข้อง (ตามที่พวกเขาทำทั้งหมด) และเราต้องการลดผลกระทบต่อลูกค้าของเราดังนั้นตัวอย่างเช่นพวกเขาจะเปิดดาต้าเซ็นเตอร์ B หากดาต้าเซ็นเตอร์ A หยุดทำงาน เมื่อเราอัปเกรดเวอร์ชันเราจะปิดเว็บไซต์เพื่อการบำรุงรักษาและโดยปกติจะใช้เวลาสองสามชั่วโมง (สคริปต์การย้ายข้อมูล ฯลฯ ) เราต้องการให้ผู้ใช้มีช่วงการเปลี่ยนภาพที่ราบรื่นยิ่งขึ้นโดยมีเวลาหยุดทำงานน้อยที่สุดเท่าที่จะเป็นไปได้ (พวกเขาใช้เซิร์ฟเวอร์ B ในขณะที่กำลังอัปเกรดเซิร์ฟเวอร์ A) Optionnaly ลูกค้าของเราตั้งอยู่ทั่วโลกและเราต้องการให้พวกเขามีประสบการณ์ที่ดีที่สุดเท่าที่จะเป็นไปได้แม้จะมีการเชื่อมต่อเส็งเคร็ง (ใครก็ตามที่ทำงานกับผู้พัฒนาอินเดียควรรู้ว่าฉันหมายถึงอะไร) ตามหลักการแล้วเราต้องการเชื่อมต่อเซิร์ฟเวอร์ในสำนักงานของพวกเขา (หรือใช้ดาต้าเซ็นเตอร์ใกล้เมือง) และมันจะรวมเข้ากับสถาปัตยกรรมของเราได้อย่างราบรื่น เราไม่ต้องการความพร้อมใช้งานจากระยะไกล 99% หรือแม้แต่ 95% มันเป็นแอพจัดการเอกสาร ไม่มีใครสนใจ. แต่เนื่องจากการย้ายข้อมูลอาจใช้เวลาสักครู่และมีลูกค้าทั่วโลกบางครั้งเราป้องกันไม่ให้ลูกค้าทำงานเกือบตลอดทั้งวัน สำหรับส่วนของ SQL แม้ว่าจะไม่มี DBA ที่ "ถูกต้อง" แต่เรารู้เกี่ยวกับความเป็นไปได้ของ …

2
REST API สามารถส่งคืนทรัพยากรจำนวนมากเป็นทรัพยากรทรัพยากรเดียวได้หรือไม่
ฉันอยู่ระหว่างดำเนินการสร้าง REST API และขณะนี้ฉันกำลังประสบปัญหาดังต่อไปนี้: Fooเป็นทรัพยากรแรก การดำเนินการ CRUD สามารถนำไปใช้ผ่าน/foo/URI Barเป็นทรัพยากรที่สอง การดำเนินการ CRUD สามารถนำไปใช้ผ่าน/bar/URI ทุกคนมีความเกี่ยวข้องกับศูนย์หรือหนึ่งFoo Barเหตุผลที่ฉันไม่ถือว่าBarเป็นแหล่งข้อมูลย่อยของFooคือเนื่องจากBarอินสแตนซ์เดียวกันสามารถใช้ร่วมกันระหว่าง mutiple Foos ดังนั้นผมจึงคิดว่ามันจะดีกว่าที่จะเข้าถึงได้ผ่านทางเป็นอิสระ URI /foo/[id]/barแทน ปัญหาของฉันคือในกรณีจำนวนมากลูกค้าที่ขอFooอินสแตนซ์ก็สนใจBarอินสแตนซ์ที่เกี่ยวข้องเช่นกัน ขณะนี้หมายความว่าพวกเขาจะต้องดำเนินการสองแบบสอบถามแทนหนึ่งแบบสอบถาม ฉันต้องการแนะนำวิธีที่ช่วยให้รับวัตถุทั้งสองด้วยการสืบค้นเพียงครั้งเดียว แต่ฉันไม่รู้วิธีจำลอง API สำหรับการทำ สิ่งที่ฉันมาด้วย: ฉันสามารถแนะนำพารามิเตอร์การสืบค้นที่คล้ายกับสิ่งนี้: /foo/[id]?include_bar=true. ปัญหาด้วยวิธีการนี้คือการเป็นตัวแทนทรัพยากร (เช่นโครงสร้าง JSON) ของการตอบสนองจะต้องดูแตกต่างกัน (เช่นภาชนะเช่น{ foo: ..., bar: ... }แทนที่จะเป็นแบบอนุกรมFoo) ซึ่งทำให้Fooจุดสิ้นสุดของทรัพยากร "แตกต่าง" ฉันไม่คิดว่ามันเป็นสิ่งที่ดี เมื่อทำการสอบถาม/fooลูกค้าควรได้รับการแสดงทรัพยากรเดียวกัน (โครงสร้าง) เสมอโดยไม่คำนึงถึงพารามิเตอร์การสืบค้น /fooandbar/[foo-id]ความคิดก็คือการแนะนำปลายทางอ่านอย่างเดียวใหม่เช่น ในกรณีนี้จะไม่มีปัญหาในการส่งคืนการแสดงแทนเช่น{ foo: ..., bar: ... …

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

3
มีจุดใดบ้างในการใช้ตัวสร้างและส่วนต่อประสานกับวัตถุเริ่มต้น?
ใน Java และ C # คุณสามารถสร้างวัตถุที่มีคุณสมบัติที่สามารถตั้งค่าได้ที่การเริ่มต้นโดยการกำหนดตัวสร้างด้วยพารามิเตอร์การกำหนดแต่ละคุณสมบัติหลังจากการสร้างวัตถุหรือการใช้รูปแบบส่วนต่อประสานการสร้าง / ของเหลว อย่างไรก็ตาม C # 3 แนะนำวัตถุเริ่มต้นและคอลเลกชันซึ่งหมายความว่ารูปแบบการสร้างไม่ได้ผลส่วนใหญ่ ในภาษาที่ไม่มีค่าเริ่มต้นเราสามารถใช้เครื่องมือสร้างจากนั้นใช้มันเพื่อ: Vehicle v = new Vehicle.Builder() .manufacturer("Toyota") .model("Camry") .year(1997) .colour(CarColours.Red) .addSpecialFeature(new Feature.CDPlayer()) .addSpecialFeature(new Feature.SeatWarmer(4)) .build(); ในทางกลับกันใน C # one สามารถเขียน: var vehicle = new Vehicle { Manufacturer = "Toyota", Model = "Camry", Year = 1997, Colour = …

1
การพึ่งพา Node.js มีน้ำหนักมากเกินไป
เมื่อเร็ว ๆ นี้ฉันเริ่มเล่นกับ node.js ทีนี้ทุก ๆ บทช่วยสอนจะบอกว่าคุณควรเริ่มด้วย npm init จากนั้นพูดว่าคุณต้องการเฟรมเวิร์กเซิร์ฟเวอร์มาตรฐานพูดว่าคุณเลือกด่วน: npm install express แต่คุณจะต้องการสิ่งอื่น ๆ อีกมากมายที่คุณคุ้นเคยจากโลกอย่าง ASP.NET ฉันพูดเกี่ยวกับแม่แบบเอ็นจิ้น (หยก) และสไตล์พรีโปรเซสเซอร์ (SASS) แล้วพวกเขาก็บอกคุณว่า "ติดตั้ง gulp / grunt! เพื่อให้คุณสามารถลดขนาดและทำให้อัปเดตและรันเซิร์ฟเวอร์และสิ่งอื่น ๆ อีกมากมายโดยอัตโนมัติ!" และนั่นหมายถึงการติดตั้ง gulp, node-sass และ gulp-sass และ gulp-uglify และอาจจะมีสิ่งดีๆอีกมากมาย (tsd หรือ babel, markdown ฯลฯ ) ... แต่สิ่งเหล่านั้นมีอยู่มากในดิสก์และโปรเจ็กต์ อย่าค้นหาสักครู่และคุณสามารถค้นหาตัวเองด้วยขนาดดิสก์ 100MB + สำหรับโครงการนั้น (ซึ่งยังไม่ได้เริ่มเลย!) …

1
การให้ไฟล์วัตถุเป็นไปตามข้อเชื่อมโยง LGPL relink หรือไม่?
จากคำถามนี้ดังนั้นฉันอ่าน: รหัสที่มาที่เป็นกรรมสิทธิ์ + รหัสที่มา LGPL เชื่อมโยงแบบคงที่: คุณต้องปล่อยทั้งสองส่วนเป็น LGPL หรือจัดหาทุกอย่างที่อนุญาตให้ผู้ใช้เชื่อมโยงแอปพลิเคชันด้วยซอร์สโค้ด LGPL รุ่นอื่น ในกรณีนี้ข้อกำหนดอื่น ๆ จะเหมือนกับว่ามีการเชื่อมโยงแบบไดนามิก ดังนั้นดูเหมือนว่าการให้ไฟล์ออบเจ็กต์นั้นเพียงพอที่จะทำให้ LGPL พึงพอใจในแง่ของการเชื่อมโยงไลบรารี LGPL กับแอปพลิเคชันรหัสที่เป็นกรรมสิทธิ์ ในขณะที่การปฏิบัติการนั้นเชื่อมโยงแบบสแตติกการจัดเตรียมอ็อบเจ็กต์ไฟล์อนุญาตให้ผู้ใช้ปลายทางคอมไพล์แอ็พพลิเคชันอีกครั้งเชื่อมโยงไปยังไลบรารีเวอร์ชันต่าง ๆ สิ่งนี้ถูกต้องหรือไม่หากเป็นเช่นนั้นทำไม

4
การออกแบบการขับเคลื่อนโดเมนและการโต้ตอบข้ามโดเมน
ฉันเป็นมือใหม่ DDD ญาติ แต่ฉันกำลังอ่านอะไรและทุกอย่างที่ฉันสามารถรับในมือที่จะต้มออกและกลั่นความรู้ของฉัน ฉันเจอคำถาม DDD นี้และหนึ่งในคำตอบที่ฉันสนใจ บริบทและโดเมนที่ถูก จำกัด DDD? หนึ่งในคำตอบที่ผู้โพสต์ให้ตัวอย่างของระบบอีคอมเมิร์ซกับผลิตภัณฑ์ที่อยู่ในโดเมนอย่างน้อย 2 โดเมน: 1) แคตตาล็อกสินค้า 2) การจัดการสินค้าคงคลัง ตกลงนั่นคือเหตุผลทั้งหมดเช่นในส่วนหน้าอีคอมเมิร์ซของคุณคุณมีความสนใจในการแสดงข้อมูลผลิตภัณฑ์และไม่สนใจในการจัดการสินค้าคงคลัง แต่. คุณอาจต้องการแสดงระดับสินค้าคงคลังบนหน้าเว็บหรือคุณอาจต้องการแสดงหมายเลขรุ่นของสินค้าคงคลังในสต็อก (ลองนึกภาพว่าสินค้าคงคลังของคุณคือหนังสือนิตยสาร ฯลฯ ) ข้อมูลนี้มาจากโดเมนสินค้าคงคลัง ดังนั้นคุณจะจัดการกับสิ่งนี้อย่างไร คุณจะ a) โหลดทั้งโดเมนผลิตภัณฑ์และการรวมโดเมนสินค้าคงคลังหรือไม่ b) คุณจะถือคุณสมบัติบางอย่างในเอนทิตีโดเมนผลิตภัณฑ์ของคุณสำหรับตัวเลขในสต็อกและรุ่นในสต็อกจากนั้นใช้กิจกรรมโดเมนเพื่ออัปเดตเหล่านี้เมื่อมีการอัปเดตเอนทิตีสินค้าคงคลังหรือไม่ คำถามสุดท้ายหนึ่งข้อ ฉันรู้ว่าเราหมายถึงการลืม / เพิกเฉยต่อการคงอยู่ของโดเมนและเพียงแค่คิดถึงโดเมน แต่เพียงคิดผ่านตัวอย่างข้างต้นเราจะจบลงด้วย 2 DB ตารางที่อาจเกิดขึ้นสำหรับแคตตาล็อกสินค้าและสินค้าคงคลังสินค้า ตอนนี้เราจะใช้ตัวระบุเดียวกันในสิ่งเหล่านี้เพราะเป็นผลิตภัณฑ์เดียวกันหรือไม่ หรือเราสามารถใช้ 1 ตารางและ 1 แถวของตารางสำหรับข้อมูลและแมปข้อมูลที่เกี่ยวข้องกับคุณสมบัติรวมได้หรือไม่

1
การทดสอบหน่วยสำหรับท่อส่งข้อมูลที่ประกอบด้วยฟังก์ชันหนึ่งบรรทัด
การอ่านบทนำเชิงปฏิบัติของแมรี่โรสคุกเกี่ยวกับการเขียนโปรแกรมเชิงฟังก์ชั่นเธอเป็นตัวอย่างของรูปแบบการต่อต้าน def format_bands(bands): for band in bands: band['country'] = 'Canada' band['name'] = band['name'].replace('.', '') band['name'] = band['name'].title() ตั้งแต่ ฟังก์ชั่นทำมากกว่าหนึ่งอย่าง ชื่อไม่ได้อธิบาย มันมีผลข้างเคียง ในฐานะที่เป็นโซลูชั่นที่นำเสนอเธอแนะนำให้ใช้ฟังก์ชันที่ไม่ระบุชื่อไปป์ไลน์ pipeline_each(bands, [call(lambda x: 'Canada', 'country'), call(lambda x: x.replace('.', ''), 'name'), call(str.title, 'name')]) อย่างไรก็ตามเรื่องนี้ดูเหมือนว่าฉันจะมีข้อเสียของการเป็นที่ทดสอบได้น้อยลง; อย่างน้อย format_bands อาจมีการทดสอบหน่วยเพื่อตรวจสอบว่ามันเป็นสิ่งที่มันหมายถึง แต่วิธีการทดสอบท่อ? หรือความคิดที่ว่าฟังก์ชั่นนิรนามนั้นอธิบายตนเองได้โดยที่พวกเขาไม่จำเป็นต้องทำการทดสอบ? แอปพลิเคชันที่ใช้งานจริงของฉันสำหรับสิ่งนี้กำลังพยายามทำให้pandasโค้ดของฉันทำงานได้มากกว่า ฉันมักจะมีขั้นตอนในการ "munging" def munge_data(df) df['name'] = df['name'].str.lower() df = …

4
REST API ควรจะสามารถแปลงวันที่และเวลาเป็นเขตเวลาไคลเอนต์ที่เหมาะสมได้หรือไม่?
ในขณะที่ใช้ API ของเราปัญหาของวันที่และเวลาและเขตเวลาก็เกิดขึ้น วันที่ทั้งหมดถูกปรับให้เป็น UTC ในฐานข้อมูล ปัจจุบันในแอปพลิเคชันที่ไม่ใช่ API ชุดข้อมูลทั้งหมดจะถูกแปลงตามการตั้งค่าของผู้ใช้ก่อนนำเสนอ ตอนนี้มีคำถามเดียวกันสำหรับ API: API ควรจะสามารถคืนค่าวันที่และเวลาที่เหมาะสมสำหรับเขตเวลาตามความหมายของคำขอหรือไม่ เช่นGET /posts?timezone=America/Sao_Paulo? หรือควรจะทำในสิ่งที่ลูกค้ากำลังเข้าถึง API? อัปเดต:เนื่องจากมีการเกิดขึ้นสองสามครั้ง: เวลาปัจจุบันที่มีเขตเวลาจะถูกส่งคืน (แม้ว่าจะเป็นออฟเซ็ต TZ เสมอ+00:00) รูปแบบที่เป็นที่นิยม 8601:2015-10-29T23:00:49+00:00
10 rest  api  time 

3
ลำดับความสำคัญของฟังก์ชั่นในอัลกอริทึม Shunting-yard
ฉันกำลังทำงานผ่านอัลกอริทึม Shunting-yardดังที่วิกิพีเดียอธิบายไว้ คำอธิบายของอัลกอริทึมเมื่อจัดการกับตัวดำเนินการเป็นดังนี้: ถ้าโทเค็นเป็นตัวดำเนินการ o1 ดังนั้น: ในขณะที่มีโทเค็นของโอเปอเรเตอร์ o2 ที่ด้านบนสุดของโอเปอเรเตอร์สแต็กและอย่างใดอย่างหนึ่ง o1 is left-associative and its precedence is less than or equal to that of o2, or o1 is right associative, and has precedence less than that of o2, จากนั้นป๊อป o2 จากตัวดำเนินการสแต็กลงบนเอาต์พุตคิว กด o1 ลงบนสแต็กโอเปอเรเตอร์ อย่างไรก็ตามพวกเขาให้ตัวอย่างต่อไปนี้: การป้อนข้อมูล: sin max 2 3 / …

4
การรับประกันความไม่สามารถเปลี่ยนแปลงได้นั้นเป็นเพียงเหตุผลในการเปิดเผยฟิลด์แทนที่จะเป็นคุณสมบัติหรือไม่?
คำแนะนำทั่วไปสำหรับ C # คือการใช้คุณสมบัติเหนือเขตข้อมูลสาธารณะเสมอ สิ่งนี้สมเหตุสมผลโดยการเปิดเผยฟิลด์คุณจะเปิดเผยรายละเอียดการใช้งานมากมาย ด้วยคุณสมบัติคุณสามารถสรุปรายละเอียดดังกล่าวได้ดังนั้นจึงซ่อนตัวจากการใช้งานรหัสและการเปลี่ยนแปลงการใช้งานจะแยกออกจากการเปลี่ยนแปลงส่วนต่อประสาน อย่างไรก็ตามฉันสงสัยว่าบางครั้งมีข้อยกเว้นที่ถูกต้องสำหรับกฎนี้เมื่อจัดการกับreadonlyคำหลัก โดยการใช้คำหลักนี้กับเขตข้อมูลสาธารณะคุณจะรับประกันเพิ่มเติม: immutability นี่ไม่ได้เป็นเพียงรายละเอียดการนำไปปฏิบัติความไม่เปลี่ยนแปลงเป็นสิ่งที่ผู้บริโภคอาจสนใจการใช้readonlyเขตข้อมูลทำให้เป็นส่วนหนึ่งของสัญญาสาธารณะและสิ่งที่ไม่สามารถทำลายได้โดยการเปลี่ยนแปลงในอนาคตหรือการสืบทอดโดยไม่ต้องปรับเปลี่ยนส่วนต่อสาธารณะ นั่นคือสิ่งที่ทรัพย์สินไม่สามารถให้ได้ ดังนั้นการรับประกันการเปลี่ยนแปลงไม่ได้จึงเป็นเหตุผลที่ถูกกฎหมายในการเลือกreadonlyเขตข้อมูลเหนือทรัพย์สินในบางกรณี? (เพื่อความกระจ่างฉันไม่ได้พูดอย่างแน่นอนว่าคุณควรเลือกตัวเลือกนี้เสมอเพราะสนามไม่สามารถเปลี่ยนแปลงได้ในขณะนี้เฉพาะเมื่อมันมีความเหมาะสมในการเป็นส่วนหนึ่งของการออกแบบของชั้นเรียน ฉันส่วนใหญ่สนใจคำตอบที่เพ่งความสนใจไปที่ว่านี่อาจเป็นเหตุผลมากกว่ากรณีเฉพาะที่ไม่เช่นเมื่อคุณต้องการสมาชิกที่อยู่ในinterfaceหรือต้องการโหลดขี้เกียจ)

3
คุณสมบัตินามธรรมในคลาสฐานเพื่อบังคับให้โปรแกรมเมอร์กำหนดมัน
ฉันกำลังเขียนโค้ดด้วยรูปแบบสถานะสำหรับอุปกรณ์ฝังตัว ฉันมีคลาสฐาน / นามธรรมที่เรียกว่าสถานะและจากนั้นแต่ละสถานะแยก (คอนกรีต) แยกชั้นใช้ระดับรัฐนามธรรม ในระดับรัฐฉันมีวิธีนามธรรมหลายอย่าง ถ้าฉันไม่ใช้วิธีนามธรรมในคลาส discrete (คอนกรีต), Visual Studio จะให้ข้อผิดพลาดดังนี้: ... ข้อผิดพลาด 1 'myConcreteState' ไม่ได้ใช้สมาชิกนามธรรมที่สืบทอด 'myAbstractState' ตอนนี้: ฉันกำลังพยายามสร้างคุณสมบัติสตริงสำหรับแต่ละรัฐชื่อ StateName เมื่อใดก็ตามที่ฉันสร้างคลาสคอนกรีตใหม่ฉันต้องกำหนด StateName ฉันต้องการให้ VS ส่งข้อผิดพลาดหากฉันไม่ได้ใช้ มีวิธีง่าย ๆ ในการทำเช่นนี้? ฉันได้ลองในชั้นนามธรรม / ฐาน: public abstract string StateName { get; set; } แต่ฉันไม่จำเป็นต้องใช้วิธีการรับและตั้งค่าในแต่ละรัฐ คำถามที่มีการแก้ไข: ในสถานการณ์ที่เหมาะสมอุดมคติแต่ละระดับของรัฐจะต้องกำหนดให้ StateName กำหนดและสืบทอดมาจากคลาสฐานนามธรรม StateName = "MyState1"; //or …

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