วันนี้มีคำถามโผล่ในใจของฉัน:
วิธีที่เราใช้ Javascript กับเกือบทุกอย่างที่ถือว่าเป็นแนวปฏิบัติที่ดีในการพัฒนาซอฟต์แวร์แบบดั้งเดิมหรือไม่?
ฉันมีชุดคำถาม / ข้อสังเกตที่เกี่ยวข้องกับคำชี้แจงนี้ แต่เพื่อให้เป็นไปตามรูปแบบของ StackExchange มันจะดีกว่าถ้าฉันแยกพวกเขาออกเป็นคำถามที่แตกต่างกัน
โมดูลที่ต้องการ
รหัส Javascript มาตรฐานทุกวันนี้ดูเหมือนว่า:
const someModule = require('./someModule')
module.exports = function doSomethingWithRequest() {
// do stuff
someModule.someFunc()
// do other stuff
}
ข้อดี
- การห่อหุ้ม: โมดูลทำงานแบบสแตนด์อโลนและรู้ทุกอย่างที่จำเป็นในการทำหน้าที่ของมัน
- ลูกค้าสามารถใช้โมดูลได้ง่ายขึ้น
ข้อเสีย
- การตรวจสอบได้แย่: นี่คือมาตรฐานเมื่อไม่ได้ใช้ DI แต่ในภาษาแบบไดนามิกเช่นจาวาสคริปต์ไว้ก็สามารถโกง * โดยโมดูลเหมือนหรือ
mockery
rewire
- แน่นอนมันละเมิดกรม - ไม่ต้องสับสนกับการพึ่งพาการฉีด - เนื่องจากฉันสามารถนำเข้าโมดูลที่เป็นรูปธรรมได้เท่านั้น
- มันอาจละเมิดOCP - ตัวอย่างเช่นสมมติว่าฉันมีโมดูลบันทึกที่เขียนไปยังระบบไฟล์ (ผ่าน
fs
โมดูล) ถ้าฉันต้องการขยายโมดูลบันทึกนี้เพื่อส่งไปยังเครือข่ายมันจะยากมาก
* สิ่งนี้อาจทำงานร่วมกับ CommonJS หรือโมดูลของ AMD ได้เนื่องจากส่วนใหญ่จะใช้งานในพื้นที่ของผู้ใช้ อย่างไรก็ตามฉันไม่แน่ใจว่ามันจะเป็นไปได้อย่างไรด้วยimport
ไวยากรณ์ES6
ฉีดพึ่งพา
การใช้การฉีดพึ่งพามันจะเป็นเหมือน:
module.exports = function doSomethingWithRequest(someModule) {
// do stuff
someModule.someFunc()
// do other stuff
}
ข้อดี
- เพิ่มความสามารถในการทดสอบ: ตอนนี้การ stub / mock ง่ายขึ้น
someModule
แม้ใช้ไวยากรณ์ ES6 - เป็นไปได้ที่จะให้เกียรติจุ่ม: ไม่จำเป็นว่าเป็นเพราะโมดูลลูกค้ายังสามารถตั้งโปรแกรมให้กับการใช้งานและไม่ได้เป็นส่วนต่อประสาน
ข้อเสีย
- การห่อหุ้มที่ใช้งานไม่ได้: คำถามหลักที่เหลืออยู่คือ:
ตกลงแล้วใครจะเป็นผู้สร้าง / ต้องการการพึ่งพา?
- ทำที่ลูกค้าของโมดูลทุกดูเหมือนมากWET
- นี่อาจจะทำให้ฉันต้องใช้ DI Container เพื่อให้เป็นไปได้ในโครงการจริง
ดังนั้นคำถามจริงที่นี่คือ:
ทำไมนักพัฒนา Javascript มีแนวโน้มที่จะพึ่งพาวิธีแรก?
นี่เป็นเพียง "วิธี Javascript" หรือไม่
ตัวฉันเองเขียนโค้ดแบบนี้บ่อยครั้ง ฉันมีส่วนแบ่งการตั้งค่าการทดสอบที่เป็นธรรมโดยใช้ห้องสมุดที่เยาะเย้ย แต่มันก็รู้สึกผิดอยู่เสมอ
ฉันพลาดอะไรไปรึเปล่า?