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

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

2
การประกาศฟิลด์ในคลาสจริง ๆ แล้วเป็นอันตรายใน PHP หรือไม่
พิจารณาโค้ดต่อไปนี้ซึ่งตัวตั้งค่าใช้งานไม่ได้เนื่องจากเจตนาผิดพลาดในการตั้งโปรแกรมแบบธรรมดาที่ฉันเคยทำมาแล้วสองสามครั้งในอดีต: <?php class TestClass { private $testField; function setField($newVal) { $testField = $newVal; // deliberately broken; should be `$this->testField = $newVal` } function getField() { return $this->testField; } } $testInstance = new TestClass(); $testInstance->setField("Hello world!"); // Actually prints nothing; getField() returns null echo $testInstance->getField(); ?> ความจริงที่ฉันประกาศ$testFieldที่ด้านบนของชั้นเรียนช่วยปกปิดข้อผิดพลาดในการเขียนโปรแกรมจากฉัน หากฉันไม่ได้ประกาศเขตข้อมูลฉันจะได้รับข้อความคล้ายกับคำเตือนต่อไปนี้ที่พิมพ์ลงในบันทึกข้อผิดพลาดของฉันเมื่อเรียกสคริปต์นี้ซึ่งอาจเป็นประโยชน์ในการช่วยแก้ไขข้อบกพร่องของฉัน - โดยเฉพาะอย่างยิ่งถ้าฉันทำข้อผิดพลาดเช่นนี้ แอปพลิเคชันในโลกแห่งความจริงที่มีขนาดใหญ่และซับซ้อน: …
13 php 

4
การฉีดพึ่งพามือเป็นทางเลือกที่ดีกว่าในการจัดองค์ประกอบและความหลากหลาย?
ก่อนอื่นฉันเป็นโปรแกรมเมอร์ระดับต้น ในความเป็นจริงฉันกำลังจบระดับ AS ด้วยโปรเจ็กต์สุดท้ายของฤดูร้อน ในงานใหม่ของฉันเมื่อไม่มีโครงการให้ฉันทำ (พวกเขากำลังรอที่จะเติมทีมด้วยการจ้างงานใหม่) ฉันได้รับหนังสือให้อ่านและเรียนรู้จากในขณะที่ฉันรอ - ตำราบางเล่มอื่น ๆ ไม่มาก (เช่น Code Complete) หลังจากอ่านหนังสือเหล่านี้ฉันได้หันไปใช้อินเทอร์เน็ตเพื่อเรียนรู้ให้มากที่สุดและเริ่มเรียนรู้เกี่ยวกับ SOLID และ DI (เราได้พูดถึงหลักการทดแทนของ Liskov แต่ไม่ได้มีแนวคิด SOLID อื่น) เพื่อที่ฉันจะได้เรียนรู้ฉันนั่งลงเพื่อเรียนรู้ให้ดีขึ้นและเริ่มเขียนโค้ดเพื่อใช้ DI ด้วยมือ (ไม่มีกรอบ DI บนคอมพิวเตอร์การพัฒนา) สิ่งที่ฉันทำมันฉันสังเกตเห็นว่ามันรู้สึกคุ้นเคย ... และดูเหมือนว่ามันเป็นเหมือนงานที่ฉันเคยทำในอดีตโดยใช้องค์ประกอบของคลาสนามธรรมโดยใช้ polymorphism ฉันคิดถึงภาพที่ใหญ่กว่านี้หรือไม่? มีบางอย่างเกี่ยวกับ DI (อย่างน้อยด้วยมือ) ที่ไปได้หรือไม่? ฉันเข้าใจถึงความเป็นไปได้ของการกำหนดค่าที่ไม่ได้อยู่ในรหัสของกรอบงาน DI บางอันที่มีประโยชน์มากพอ ๆ กับการเปลี่ยนแปลงสิ่งต่าง ๆ โดยไม่ต้องคอมไพล์ใหม่ แต่เมื่อทำด้วยมือฉันไม่แน่ใจว่ามันแตกต่างจากที่ระบุข้างต้น ... ข้อมูลเชิงลึกเกี่ยวกับเรื่องนี้จะมีประโยชน์มาก!

6
การปฏิบัติที่ดีที่สุดสำหรับการใช้งานการพิมพ์ / ความช่วยเหลือ (- ความช่วยเหลือ) คืออะไร?
เมื่อเขียนเครื่องมือสำหรับ CLI ของ UNIX ฉันจะทำให้โปรแกรมพิมพ์วิธีใช้และ / หรือการใช้งานได้อย่างไร ฉันมักจะใช้fprintf(stderr, "help text here");แต่มีหลายปัญหาด้วยกัน stderrครั้งแรกผมไม่แน่ใจว่าไม่ว่าฉันควรใช้ ตกลงหรือฉันควรใช้stdout? อย่างที่คุณสามารถจินตนาการได้ข้อความช่วยเหลือค่อนข้างยาวขึ้นอยู่กับจำนวนตัวเลือกของเครื่องมือ ตอนนี้ฉันมักจะใส่หลาย ๆ อย่าง"strings like that\n"ในพารามิเตอร์ที่สอง อย่างไรก็ตามสิ่งนี้เติมรหัสต้นฉบับของฉันด้วยข้อความช่วยเหลือห้าสิบรายการขึ้นไป มันไม่สามารถจัดการได้ง่ายเลย ฉันควรทำอย่างไรดี เมื่อเครื่องมือไม่ได้เขียนในภาษา C หรือภาษา C ฉันมักจะใช้ที่นี่ docsที่เป็นไปได้ (ส่วนใหญ่เด่นชัดด้วย Perl) ฉันไม่สามารถใช้สิ่งนั้นใน C แต่มีอะไรแบบนั้นที่ฉันสามารถใช้ได้หรือไม่? ฉันกำลังพิจารณาที่จะวางมันไว้headerfile.hข้างใน a #define HELP "help text here"ฉันไม่เคยเห็นมันมาในป่าไม่รู้ว่าฉันควรใช้มันหรือไม่ เป็นการดีที่ฉันสามารถใส่ข้อความในไฟล์ภายนอกและรวมไว้ ใช้#includeสำหรับสิ่งที่ดูเหมือนว่าผิด ฉันควรทำอย่างไร แนวคิดคือมีข้อความช่วยเหลือที่สามารถจัดการได้ง่าย การเก็บไว้ในซอร์สโค้ดไม่สะดวกจริงๆ

4
ฉันสามารถใช้การเข้ารหัสชนิดใดเพื่อทำให้สตริงสั้นลงได้
ฉันสนใจในการเข้ารหัสสตริงที่ฉันมีและฉันอยากรู้ว่ามีการเข้ารหัสประเภทใดบ้างที่สามารถใช้ได้ซึ่งจะรวมเฉพาะอักขระอัลฟ่าและตัวเลขและควรลดจำนวนอักขระที่ต้องใช้เพื่อเป็นตัวแทนสตริง จนถึงตอนนี้ฉันได้ดูการใช้การเข้ารหัส Base64 เพื่อทำสิ่งนี้ แต่ดูเหมือนว่าจะทำให้สตริงของฉันยาวขึ้นและบางครั้งก็รวมถึง==สิ่งที่ฉันต้องการหลีกเลี่ยง ตัวอย่าง: ชื่อทดสอบ | 120101 กลายเป็น dGVzdCBuYW1lfDEyMDEwMQ == ซึ่งเพิ่มจาก 16 ถึง 24 อักขระและรวมถึงตัวอักษรและตัวเลขที่ไม่ใช่ ไม่มีใครรู้ว่าการเข้ารหัสชนิดอื่นที่ฉันสามารถใช้เพื่อให้บรรลุความต้องการของฉันได้หรือไม่? คะแนนโบนัสหากมันอยู่ภายในกรอบ. NET หรือมีห้องสมุดบุคคลที่สามที่จะทำการเข้ารหัส

4
อะไรคือความเสี่ยง / ความเสี่ยงด้านความปลอดภัยของโปรแกรมเมอร์ C ทุกคนที่ต้องระวัง? [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว มีความเสี่ยงด้านความปลอดภัยมากมายจากการสัมผัสอย่างใกล้ชิดกับฮาร์ดแวร์ซึ่งต่างจากการใช้ API ที่ผ่านการทดสอบและผ่านการพิสูจน์แล้วจากภาษาโปรแกรมระดับสูง มันง่ายกว่ามากที่จะทำให้บัฟเฟอร์ล้นใน C กว่าในภาษาเช่น Java อะไรคือความเสี่ยงหรือช่องโหว่ (เช่น buffer overflow) ที่โปรแกรมเมอร์ C ทุกคนควรระวัง (ช่องโหว่ IE ที่เกี่ยวข้องกับโปรแกรมเมอร์ C) ปัญหาเหล่านี้นำไปสู่ปัญหาอะไร จะหลีกเลี่ยงพวกเขาได้อย่างไรและอะไรคือข้อผิดพลาดทั่วไปที่ทำให้สิ่งเหล่านี้เกิดขึ้นในโปรแกรม?

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

2
ฉันจะใช้ทักษะการเขียนโปรแกรมของฉันให้ดีได้อย่างไร
ในฤดูใบไม้ร่วงนี้เว็บไซต์ขนาดเล็กสองแห่งของฉันควรสร้างประมาณ $ 1,200 ต่อเดือนโดยมีการป้อนข้อมูลน้อยที่สุด / เป็นศูนย์ซึ่งเพียงพอสำหรับฉันที่จะใช้ชีวิตอย่างสะดวกสบาย แทนที่จะเริ่มดำเนินธุรกิจอื่นฉันอยากจะใช้เวลาสองสามปีข้างหน้าในการทำสิ่งที่ดีจริงๆหรือช่วยเหลือผู้อื่นที่ต้องการ ฉันต้องการใช้เวลา 4 หรือ 5 ปีทุ่มเทเวลาให้กับสิ่งที่สมควรและทำอย่างเต็มที่เท่าที่จะทำได้เพื่อช่วยในการพัฒนาเว็บและทักษะการเขียนโปรแกรมที่ฉันมีอยู่แล้ว ปัญหาคือฉันไม่รู้ว่าจะเริ่มจากตรงไหน ฉันไม่มีความคิดที่ยอดเยี่ยมเกี่ยวกับตัวฉันเองและไม่เชื่อในองค์กรการกุศลขนาดใหญ่มากมาย โดยหลักการแล้วฉันต้องการค้นหาโครงการขนาดเล็กที่ทุกคนไม่ได้รับค่าตอบแทนและมุ่งเน้นไปที่การช่วยเหลือ มีองค์กรขนาดเล็กเช่นนี้หรือไม่? ใครบ้างมีความคิดสำหรับโครงการ / เว็บไซต์ / แอพที่สามารถช่วยเหลือผู้คนที่ต้องการพวกเขาต้องการให้ฉันทำงานหรือทำงานกับพวกเขา ฉันรู้ว่านี่ไม่ใช่ StackOverflow ทั่วไป 2 + 2 =? พิมพ์คำถามและพวกคุณบางคนจะอยากลบ แต่พิจารณาลักษณะการกุศลของอุตสาหกรรมไอที (ดูที่ตัวเองดังนั้น) นี่เป็นคำถามที่เกี่ยวข้องมากกับนักพัฒนาหลายคนทั้งตอนนี้หรือ ณ จุดหนึ่งในอาชีพของพวกเขา เมื่อพิจารณาถึงเหตุการณ์ล่าสุดในญี่ปุ่นคำถามนี้มีความเกี่ยวข้องกับคนจำนวนมากที่มองหาวิธีที่พวกเขาสามารถช่วยเหลือผู้อื่นด้วยทักษะ / เวลาที่พวกเขามี รอคอยที่จะอ่านความคิด / คำตอบของคุณจริงๆขอบคุณพวกคุณ
13 c#  java  php  javascript  jquery 

3
ความสัมพันธ์กับลูกค้าในการพัฒนาที่คล่องตัว
ผู้บริหารของฉันเพิ่งถามคำถามที่ไม่เคยมีมาก่อนในประวัติย่อของฉันกับองค์กร: "เราจะทำอะไรได้บ้างเพื่อช่วยคุณ?" ในขณะเดียวกันเรากำลังทำงานโครงการขนาดใหญ่หลายโครงการสำหรับลูกค้าใหม่ที่มีความสามารถในการผลักดันข้อกำหนดรอบโครงการกลางเป็นตำนาน การพัฒนาสำหรับคนเหล่านี้ก็เหมือนกับการเต้นแท็ปบนทรายดูด ดูเหมือนว่าเป็นโอกาสสำคัญที่จะเสนอการเปลี่ยนแปลงไปสู่แนวทางที่คล่องตัวยิ่งขึ้น สิ่งที่ฉันรู้ว่าฉันจะถูกถามและฉันไม่มีความคิดใด ๆ เกี่ยวกับวิธีการอ้าง / เสนอราคา / ใบเรียกเก็บเงินสำหรับโครงการประเภทนั้น คุณไปทุกชั่วโมงหรือไม่ คุณเสนอราคาหลายราคาหรือไม่? คุณคิดค่าบริการจากการวิ่งหรือไม่? โดยทั่วไปลักษณะของ Agile Manifesto ที่อ่านว่า "เราให้ความสำคัญกับความร่วมมือกับลูกค้าในการเจรจาต่อรองสัญญา" กำลังจะทำให้ผู้บริหารของฉันตกใจ คุณเห็นคุณค่าของสิ่งนั้นอย่างไรในโลกแห่งความเป็นจริงของลูกค้าที่ต้องการอะไรมาก

18
คุณชื่อฟังก์ชัน / ตัวแปร / ฯลฯ อะไรเมื่อคุณนึกชื่อไม่ออก [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา เมื่อคุณกำหนดฟังก์ชั่น / ตัวแปร / ฯลฯ และไม่แน่ใจว่าจะตั้งชื่ออะไรคุณตั้งชื่ออะไร คุณสร้างชื่อขึ้นมาได้อย่างไร? หากคุณใช้ชื่อชั่วคราวเป็นบัตรสถานที่จนกว่าคุณจะให้มันเป็นชื่อจริงคุณใช้ชื่ออะไรชั่วคราว ปรับปรุง ฉันได้ใช้สิ่งที่ชอบWILL_NAME_LATER, หรือNEEDS_NAME TO_BE_NAMEDฉันหวังว่าจะมีการประชุมที่เป็นลูกบุญธรรมจริง ๆ แล้วฉันหวังว่าถ้าฉันใช้การประชุมที่นำมาใช้นี้ IDE ของฉันจะเน้นชื่อจนกว่าฉันจะเปลี่ยนมัน

1
การขับเคลื่อนกิจกรรมและการจัดหากิจกรรมแตกต่างกันอย่างไร
ฉันกำลังศึกษาการออกแบบโดยใช้โดเมน (DDD) และพบเจอกัน: Event Driven และ Event sourcing ฉันรู้ว่ามันเกี่ยวกับการเผยแพร่กิจกรรมจากผู้ผลิตสู่ผู้บริโภคและจัดเก็บบันทึกดังนั้นคำถามของฉันคือ: การขับเคลื่อนกิจกรรมและการจัดหากิจกรรมแตกต่างกันอย่างไร

8
อินเตอร์เฟสที่เปิดเผย async ทำหน้าที่เป็นนามธรรมหรือไม่?
ฉันกำลังอ่านหนังสือหลักการพึ่งพาวิธีปฏิบัติและรูปแบบการพึ่งพาหนังสือและฉันอ่านเกี่ยวกับแนวคิดของสิ่งที่เป็นนามธรรมซึ่งอธิบายไว้ในหนังสือ วันนี้ฉันกำลังสร้างฐานรหัส C # ขึ้นใหม่โดยใช้การฉีดอ้างอิงเพื่อให้มีการใช้การโทรแบบ async แทนการบล็อก การทำเช่นนี้ฉันกำลังพิจารณาอินเทอร์เฟซบางตัวที่เป็นนามธรรมในรหัสฐานของฉันและต้องได้รับการออกแบบใหม่เพื่อให้สามารถใช้การโทรแบบ async ได้ เป็นตัวอย่างให้พิจารณาอินเตอร์เฟสต่อไปนี้ที่แสดงถึงที่เก็บสำหรับผู้ใช้แอ็พพลิเคชัน: public interface IUserRepository { Task<IEnumerable<User>> GetAllAsync(); } ตามคำนิยามของหนังสือสิ่งที่เป็นนามธรรมคือสิ่งที่เป็นนามธรรมที่ได้รับการออกแบบมาโดยเฉพาะในใจนามธรรมเพื่อให้รายละเอียดของการดำเนินการ "รั่ว" ผ่านสิ่งที่เป็นนามธรรมเอง คำถามของฉันมีดังต่อไปนี้: เราสามารถพิจารณาอินเทอร์เฟซที่ออกแบบโดยคำนึงถึง async เช่น IUserRepository เป็นตัวอย่างของ Leaky Abstraction ได้หรือไม่? แน่นอนว่าการใช้งานที่เป็นไปไม่ได้ทั้งหมดมีบางอย่างที่เกี่ยวข้องกับ asynchrony: มีเพียงการติดตั้งแบบไม่ใช้กระบวนการ (เช่นการใช้ SQL) แต่การเก็บข้อมูลในหน่วยความจำไม่จำเป็นต้องใช้แบบอะซิงโครนัส ยากถ้าอินเทอร์เฟซถูกเปิดเผยเมธอด async ตัวอย่างเช่นคุณอาจต้องส่งคืนสิ่งที่ต้องการเช่น Task.CompletedTask หรือ Task.FromResult (ผู้ใช้) ในการประยุกต์ใช้เมธอด) คุณคิดยังไงเกี่ยวกับที่ ?

2
ใน DDD บริการโดเมนเป็นเพียงรูปแบบซุ้มและ / หรือคนกลาง?
ในการออกแบบการขับเคลื่อนโดเมน Domain Layer สามารถมีบริการ (ดั้งเดิม) หลายอย่าง ตัวอย่างเช่นสำหรับโดเมนผู้ใช้เราอาจมี: UserFactory ที่สร้างวัตถุผู้ใช้ด้วยวิธีที่ต่างกัน UserRepository ซึ่งรับผิดชอบในการโต้ตอบกับ Persistence Services ในชั้นโครงสร้างพื้นฐาน UserService ใน Domain Layer นั้นเป็นเพียงแค่ผู้ไกล่เกลี่ยและ / หรือส่วนหน้าของบริการทั้งสองและโครงสร้างพื้นฐานของเลเยอร์หรือมีมากกว่านั้นหรือไม่

1
เราควรใช้ Reject หรือ Wait For Author ใน TFS เมื่อมีสิ่งที่ต้องแก้ไขหรือไม่?
ใน TFS เมื่อเราใส่ความคิดเห็นเพื่อแก้ไขสิ่งต่างๆในคำขอดึงก่อนที่เราจะยอมรับเราควรทำเครื่องหมายว่าปฏิเสธหรือรอผู้แต่งหรือไม่ ไหนดีกว่ากัน

5
ฟังก์ชั่นการโทรมีผลต่อประสิทธิภาพมากแค่ไหน
การแยกฟังก์ชั่นลงในวิธีการหรือฟังก์ชั่นเป็นสิ่งจำเป็นสำหรับรหัสแบบแยกส่วนการอ่านและการทำงานร่วมกันโดยเฉพาะอย่างยิ่งใน OOP แต่นี่หมายถึงจะมีการเรียกใช้ฟังก์ชันเพิ่มเติม การแยกรหัสของเราออกเป็นวิธีการหรือฟังก์ชั่นส่งผลกระทบต่อประสิทธิภาพการทำงานในภาษา* สมัยใหม่ได้อย่างไร? * รายการยอดนิยม: C, Java, C ++, C #, Python, JavaScript, Ruby ...

2
Logger.getLogger (MyClass.class) เป็นวิธีที่ดีที่สุดในการเริ่มต้นตัวบันทึก log4j หรือไม่
บทช่วยสอน Mkyong นี้แสดงให้เห็นถึงตัวบันทึกที่ไม่น่าสนใจด้วยวิธีนี้: @Controller public class WelcomeController { private static final Logger logger = Logger.getLogger(WelcomeController.class); // etc } ตอนนี้สมมุติว่าคลาสอื่น ๆ ที่คุณใช้มีตัวบันทึกจะเริ่มต้นตัวบันทึกได้ในลักษณะเดียวกัน คำถามของฉันคือ - นี่เป็นวิธีที่ดีที่สุดหรือไม่ ดูเหมือน ... ซ้ำแล้วซ้ำอีก
13 java  logging 

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