การปฏิบัติที่ไม่ดี - สลับกรณีเพื่อตั้งค่าสภาพแวดล้อม


32

ในช่วงสามปีที่ผ่านมาที่ฉันทำงานเป็นนักพัฒนาฉันได้เห็นตัวอย่างมากมายที่ผู้คนใช้คำสั่งสวิตช์เพื่อกำหนดเส้นทาง (ทั้งในส่วนหลังและส่วนหน้า) สำหรับ URL ด้านล่างเป็นตัวอย่างของสิ่งนี้:

ตัวอย่างด้านหลัง (C #):

public static string getHost(EnvironmentEnum environment){
    var path = String.Empty;
    switch (environment)
    {
        case EnvironmentEnum.dev:
            path = "http://localhost:55793/";
            break;
        case EnvironmentEnum.uat:
            path = "http://dev.yourpath.com/";
            break;
        case EnvironmentEnum.production:
            path = "http://yourpath.com/";
            break;
    }
    return path;
}

ตัวอย่างหน้า (JavaScript):

(function () {
    if (window.location.host.indexOf("localhost") !== -1) {
        window.serviceUrl = "http://localhost:57939/";
    }
    else if (window.location.host.indexOf("qa") !== -1) {
        window.serviceUrl = "http://dev.yourpath.com/";
    }
    else {
        window.serviceUrl = "http://yourpath.com/";
    }
})();

มีการพูดคุยกันว่ามันเป็นการปฏิบัติที่ดีหรือไม่ดีและฉันคิดว่ามันเป็นการปฏิบัติที่ไม่ดีเพราะเราต้องหลีกเลี่ยงรหัสประเภทนี้และตั้งค่าการกำหนดค่าที่เหมาะสม แต่จริงๆแล้วฉันไม่รู้คำตอบที่ถูกต้องและทำไมถึงไม่แนะนำและอะไรคือวิธีที่ถูกต้องที่จะใช้สิ่งนี้

ใครสามารถอธิบายข้อดีข้อเสียของการฝึกซ้อมข้างต้นได้บ้าง?


13
บรรทัดนี้เพียงอย่างเดียวไม่เหมาะ path = " yourpath.com "; การกำหนดค่าควรเป็นรหัสภายนอก
paparazzo

2
จากมุมมองการตรวจสอบโค้ดที่บริสุทธิ์ a Dictionaryเป็นวิธีที่เข้ารหัสได้ง่ายกว่าใน C # ดูideone.com/45g5xO หรือ JS ใช้วัตถุดีเก่าดูjsfiddle.net/1ouhovqq
Danny Beckett

4
จะเกิดอะไรขึ้นหากชื่อ บริษัท ของคุณเปลี่ยนเป็นสิ่งที่มี "qa"
user253751

โปรดจำไว้ว่าถ้าคุณใช้ไฟล์ปรับแต่งมันจำเป็นต้องได้รับการควบคุมในการควบคุมซอร์สโค้ด .... คุณต้องแก้ไขไฟล์ปรับแต่งหลายครั้งต่อวันเมื่อคุณตั้งค่าเครื่องทดสอบใหม่ ฉันยังคงคิดว่าไฟล์ปรับแต่งนั้นดีที่สุด แต่คุณอาจต้องการค้นหาไฟล์ที่มีชื่อว่า Environment เป็นพื้นฐานก่อนที่จะดูไฟล์กำหนดค่า detaul
Ian

1
ฉันไม่คิดว่าคุณควรจะเรียกสิ่งที่ไม่ดีถ้าคุณไม่สามารถบอกได้ว่าทำไมคุณถึงคิดว่ามันเป็นการปฏิบัติที่แย่
Roy

คำตอบ:


81

รหัสที่เหมาะกับคุณและง่ายต่อการบำรุงรักษาคือนิยาม "ดี" คุณไม่ควรเปลี่ยนแปลงสิ่งต่าง ๆ เพียงเพราะเชื่อฟังความคิดของใครบางคนในเรื่อง "การปฏิบัติที่ดี" ถ้าคนคนนั้นไม่สามารถชี้ให้เห็นว่าปัญหาของรหัสของคุณคืออะไร

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

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

ค่าที่กำหนดค่าตายตัวหรือไม่นั้นเป็นปัญหาขึ้นอยู่กับว่าสถานการณ์ของคุณเป็นเหมือนตัวอย่างแรกหรือมากขึ้นเช่นในตัวอย่างที่สอง


15
ฉันรักย่อหน้าแรกของคุณ แน่นอนว่าคุณติดตามด้วย ... ชี้ให้เห็นว่าปัญหาคืออะไร ... แต่แนวคิดที่ว่า "สิ่งนี้ไม่ดีเพราะบล็อก XYZ พูดเช่นนั้น" เป็นสาเหตุของรหัสที่ไม่ดีมากกว่าที่ป้องกันไว้จริง
corsiKa

5
เริ่มต้นควรจะได้รับหลักการเวลาการทดสอบจะมีชีวิตอยู่โดยไม่เพียง"ถ้ามันเหมาะกับคุณแล้วมันก็โอเค" relativism ฉันเดาว่าฉันไม่ผิดที่จะบอกว่าค่าสภาพแวดล้อมการเข้ารหัสยากเป็นการฝึกฝนที่ไม่ดีอย่างจริงจังภายใต้แสงใด ๆ
Tulains Córdova

3
@ jpmc26: คุณแน่นอนว่าการปรับใช้โค้ดฝั่งเซิร์ฟเวอร์นั้นไม่สำคัญและยังมีกระบวนการบางอย่างที่แยกต่างหากซึ่งค่าการกำหนดค่าสามารถอัปเดตได้โดยมีค่าใช้จ่ายน้อยลง ไม่จำเป็นต้องเป็นเรื่องจริง ร้านค้าหลายแห่งมีค่าใช้จ่ายน้อยมากในกระบวนการปรับใช้ ในอีกด้านหนึ่งมีร้านค้าบางแห่งที่การเปลี่ยนแปลงการกำหนดค่าโดยทั่วไปมีค่าใช้จ่ายมากเท่ากับการปรับใช้รหัสการเปลี่ยนแปลง (การตรวจสอบความถูกต้องจำเป็นต้องได้รับการอนุมัติจากกลุ่มคนทั้งหมด ฯลฯ ) ความกังวลเกี่ยวกับการทำซ้ำนั้นถูกต้องแน่นอน
Kevin Cathcart

2
ด้วยการตั้งค่าสภาพแวดล้อมที่ผสมกับรหัสแอปพลิเคชันของคุณคุณเป็นหนึ่งในข้อผิดพลาดทางตรรกะ - หรือการเปลี่ยนแปลงที่ไม่คาดคิดในสภาพแวดล้อมการดำเนินการ - ห่างจากการกดปุ่มการทดสอบจากการผลิตหรือการผลิตจากการทดสอบ การบำรุงรักษาคุณสมบัติเฉพาะของสภาพแวดล้อมที่แยกต่างหากจากรหัสใน C # นั้นเป็นเรื่องเล็กน้อย ทำไมต้องเสี่ยงที่ไม่จำเป็น?
John M Gant

1
@ user61852 "ฉันเดาว่าฉันไม่ผิดที่จะบอกว่าค่าสภาพแวดล้อมการเข้ารหัสยากคือการปฏิบัติที่ไม่ดีอย่างจริงจังภายใต้แสงใด ๆ " วิเคราะห์คำว่า "ค่าของสภาพแวดล้อมที่เข้ารหัสยากเป็นวิธีปฏิบัติที่ไม่ดีอยู่เสมอ" หากเป็นการปฏิบัติที่ไม่ดีอยู่ตลอดเวลาคุณควรระบุปัญหาอย่างน้อยหนึ่งปัญหาที่ค่าของสภาพแวดล้อมในการเข้ารหัสยากจะทำให้เกิด
emory

14

คุณคิดถูกว่านี่เป็นการฝึกฝนที่ไม่ดี ฉันเคยเห็นสิ่งนี้ในรหัสการผลิตและมันกลับมากัดคุณอยู่เสมอ

จะเกิดอะไรขึ้นเมื่อคุณต้องการเพิ่มสภาพแวดล้อมอื่น หรือเปลี่ยนเซิร์ฟเวอร์การพัฒนาของคุณ? หรือคุณต้องล้มเหลวไปยังสถานที่อื่น? คุณทำไม่ได้เนื่องจากการกำหนดค่าของคุณเชื่อมโยงกับรหัสโดยตรง

การกำหนดค่าควรถูกบังคับจากรหัสและในสภาพแวดล้อมเอง มันเป็นหลักการของแอพ Twelve-Factor ( http://12factor.net/config ) แต่เป็นวิธีปฏิบัติที่ดีสำหรับแอปพลิเคชันใด ๆ คุณอาจพบว่าตัวแปรสภาพแวดล้อมไม่เหมาะกับสถานการณ์ของคุณซึ่งในกรณีนี้ฉันขอแนะนำให้ดูที่การจัดเก็บการกำหนดค่านั้นในฐานข้อมูลของไฟล์การตั้งค่าพร้อมกับโค้ด (แต่ไม่ได้เช็คอินด้วย) รหัส


หากคุณไม่ได้ติดตามไฟล์กำหนดค่าคุณจะรู้ได้อย่างไรว่าไฟล์กำหนดค่าที่คุณใช้นั้นถูกต้องสำหรับเวอร์ชันของซอฟต์แวร์ที่คุณเพิ่งตรวจสอบจาก VCS ของคุณ (เช่นไฟล์กำหนดค่าที่ไม่ได้ติดตามไม่แตกต่างจากไฟล์ต้นฉบับที่ไม่ได้ติดตาม - คุณไม่สามารถสร้างและปรับใช้จากการชำระเงินแบบ VCS โดยไม่ใช้มัน)
mattnz

ฉันไม่เห็นด้วยว่าไฟล์การกำหนดค่าที่ไม่ได้ติดตามนั้นเป็นข้อเสนอที่ยาก วิธีที่ฉันจัดการกับเรื่องนี้มาก่อนคือสองเท่า: หนึ่งไบนารีสำหรับการปรับใช้ยังมี XML Schema ที่กำหนดค่าของมัน (เพื่อให้คุณสามารถตรวจสอบว่าไฟล์ config ที่กำหนดจะใช้งานได้) ประการที่สองไฟล์กำหนดค่าสำหรับแต่ละสภาพแวดล้อมถูกเก็บไว้ในระบบควบคุมเอกสารที่มีโฟลเดอร์ต่างกันสำหรับแต่ละสภาพแวดล้อม สิ่งที่คล้ายกันสามารถทำได้ใน Git กับสาขา - ควบคุมเวอร์ชัน แต่แยกจากรหัสสิ่งแวดล้อมน้อย
mgw854

5

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

ดังที่ได้กล่าวไว้ในคำตอบนี้หากคุณต้องการเพิ่มสภาพแวดล้อมใหม่ตอนนี้คุณต้องอัปเดตรหัสของคุณทุกที่แทนที่จะเพิ่มโปรแกรมของคุณลงในสภาพแวดล้อมใหม่

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

ข่าวร้ายหมี

ที่ดีที่สุดสิ่งที่จะต้องทำคือการตั้งค่าของคุณจากสภาพแวดล้อม (เช่นในคำตอบที่เชื่อมโยงก่อนหน้านี้สิบสองปัจจัย App มีคำแนะนำที่ดีในหัวข้อ) มีหลายวิธีในการทำเช่นนี้ขึ้นอยู่กับภาษาของคุณ หนึ่งในวิธีที่ง่ายที่สุด (ปกติ) คือการตั้งค่าตัวแปรสภาพแวดล้อม จากนั้นคุณเพียงแค่เปลี่ยนตัวแปรตามตำแหน่งที่คุณใช้งานไม่ว่าจะเป็นกล่อง dev ท้องถิ่น qa หรือการผลิต ตัวเลือกอื่นคือการจัดเก็บค่าใน.iniไฟล์หรือ JSON อีกทางเลือกหนึ่งจะเก็บค่าการกำหนดค่าของคุณเป็นรหัสจริง ขึ้นอยู่กับภาษาหรือสภาพแวดล้อมที่คุณใช้สิ่งนี้อาจจะใช่หรือไม่ใช่ความคิดที่ดี

แต่เป้าหมายสูงสุดคือการให้คุณใช้ฐานรหัสหนึ่งวางลงบนใด ๆเครื่องที่มีการสนับสนุนสถาปัตยกรรม / การเชื่อมต่อและสามารถทำงานได้โดยไม่ต้องปรับเปลี่ยนรหัสในทางใดทางหนึ่ง


1

ถ้าฉันต้องการรันแบ็กเอนด์บนเครื่องของตัวเอง แต่ไม่ใช่ในพอร์ต 55793 ตัวอย่างเช่นถ้าฉันใช้หลายรุ่นในเวลาเดียวกันเพื่อเปรียบเทียบมัน ถ้าฉันต้องการเรียกใช้แอพพลิเคชั่นแบ็กเอนด์บนเครื่องหนึ่ง แต่เข้าถึงได้จากเครื่องอื่น? ถ้าฉันต้องการเพิ่มสภาพแวดล้อมที่สี่? ดังที่คนอื่น ๆ ได้ชี้ให้เห็นคุณต้องคอมไพล์ใหม่เพียงเพื่อเปลี่ยนการตั้งค่าพื้นฐาน

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


0

มันเป็นการปฏิบัติที่ไม่ดี

หลักการพื้นฐานของการออกแบบซอฟต์แวร์: อย่ากำหนดค่าฮาร์ดโค้ดในโปรแกรมของคุณ นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งสำหรับทุกสิ่งที่มีโอกาสพอสมควรในการเปลี่ยนแปลงในอนาคต

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

บางคนสามารถย้ายการทดสอบไปยังเซิร์ฟเวอร์อื่น บางคนอาจตัดสินใจว่าต้องการสภาพแวดล้อมการฝึกอบรมผู้ใช้หรือสภาพแวดล้อมสำหรับการสาธิตการขาย พวกเขาไม่ควรไปที่โปรแกรมเมอร์เพื่อกำหนดค่าการดูแลระบบ

ซอฟต์แวร์ควรมีความยืดหยุ่นและแข็งแกร่งพอที่จะรับมือกับสถานการณ์ที่ไม่คาดคิดภายในเหตุผล

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

รหัสสิ่งที่ถูกต้องที่สุดเท่าที่จะทำได้ มีโอกาสน้อยที่จะกลายเป็นปัญหาในภายหลัง

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