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

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

2
มีคำสั่งการใช้ / นำเข้าจำนวนมากบ่งบอกถึงการออกแบบที่ไม่ดีหรือมีกลิ่นรหัสหรือไม่?
โดยปกติแล้วฉันเห็นข้อความสั่งจำนวนเล็กน้อยที่ด้านบนของไฟล์คลาส ตัวอย่าง: using System.Collections.Generic; using System.IO; using System.Xml.Linq; แต่ในโครงการฉันกำลังทำงานหลายต่อหลายครั้งฉันเห็นการใช้งาน / การนำเข้ามากกว่า 20 รายการในไฟล์คลาสเดียว นี่เป็นการออกแบบที่ไม่ดีหรือไม่? ดูเหมือนว่าคลาสที่ออกแบบมาเพื่อทำสิ่งหนึ่งควรพึ่งพาส่วนประกอบบางอย่างเท่านั้น

3
จัดเตรียม Local JS และ CSS Resources สำหรับ CDN Fallbacks
ระบุว่า CDN เป็นสิ่งที่ดีเพราะพวกเขาสามารถให้บริการทรัพยากรใกล้ชิดกับไคลเอนต์ลูกค้าสามารถแคชพวกเขาและคุณสามารถลดภาระบนเซิร์ฟเวอร์ของคุณเอง ในเบราว์เซอร์ที่ผ่านมาทรัพยากรโหลดจากเซิร์ฟเวอร์ของบุคคลที่สามไม่ได้ลดลงขอบคุณรักษาความปลอดภัยเพื่อSubresource Integrity (SRI) CDNs อาจจะลดลงหรือถูกปิดกั้นในบางประเทศและไม่สามารถใช้ได้เมื่อมีการพัฒนาแบบออฟไลน์1 ฉันคิดว่ามันน่าสนใจที่จะใช้ CDN แต่ก็พร้อมที่จะให้พวกเขาใช้งานไม่ได้ โพสต์บล็อกนี้ให้คำแนะนำที่ดีเกี่ยวกับวิธีการต่างๆ หากคุณดูตัวอย่างพื้นฐานคุณจะเห็นว่ามันมีโค้ดสำเร็จรูปจำนวนเล็กน้อยอยู่แล้วเพื่อจัดเตรียมทางเลือกสำหรับ jQuery และ Bootstrap ในขณะที่โซลูชันที่ได้รับความนิยมแนะนำให้ใช้Fallback.jsซึ่งดูเหมือนจะไม่มีการเปลี่ยนแปลงในปีที่ผ่านมา . ในทำนองเดียวกันคำถาม SO ที่เกี่ยวข้องมากที่สุดสำหรับหัวข้อเป็นเพียงการให้ทางเลือกสำหรับ jQuery อย่างไรก็ตามในโครงการโลกแห่งความเป็นจริงฉันคาดหวังว่าจะมีทรัพยากร js / css 5 รายการขึ้นไปดังนั้นฉันรู้สึกว่าคุณไม่จำเป็นต้องทำซ้ำแผ่นบาง ๆ ที่ยุ่งเหยิงเพื่อมอบทางเลือกทั้งหมด นอกจากนี้ทุกครั้งที่คุณเพิ่มหรืออัปเดตทรัพยากรคุณจะต้อง อัปเดตลิงค์ CDN อัพเดตสำเนา fallback โลคัลโดยดาวน์โหลดด้วยตนเองหรือเปลี่ยนเวอร์ชันในการกำหนดค่า npm / bower อัปเดตลิงก์ไปที่ทางเลือก อัปเดตแฮช SRI ในขณะที่ในอุดมคติของโลกฉันคาดว่าจะเพิ่ม / อัปเดตทรัพยากรในไฟล์การกำหนดค่าหนึ่งไฟล์และให้ขั้นตอนอื่นทั้งหมดดำเนินการโดยอัตโนมัติ มีเวิร์กโฟลว์ที่กำหนดไว้แล้วเพื่อให้บรรลุเป้าหมายนี้หรือไม่? หรือ CDNs และโดยเฉพาะอย่างยิ่ง SRI …
13 javascript  css  cdn 

4
ถ้า IDE ของฉันฉลาดเหลือเกินฉันจะต้องทำการ“ clone ()” ทำไม?
My IDE ( NetBeans ) ประเภทของฉันตรวจสอบCollectionsขณะที่ฉันพิมพ์รหัส แต่ทำไมฉันต้องโยนวัตถุคืนกลับมาObject.clone()? ซึ่งเป็นเรื่องปกติ ไม่เป็นอันตรายไม่มีเหม็น แต่ถึงกระนั้นฉันไม่เข้าใจ การตรวจสอบประเภทObject.clone()เป็นไปได้หรือไม่โดยไม่ต้องทำการคัดลอกวัตถุที่ส่งคืนเป็นไปไม่ได้? genericsกรอบทำให้ฉันคิดว่า IDE สามารถตรวจสอบประเภทของการอ้างอิงวัตถุบนด้านขวาของ " =เครื่องหมาย" โดยไม่ต้องหล่อในขณะที่ฉันพิมพ์? ฉันไม่เข้าใจ ภาคผนวก กรณีการใช้งานของฉันเป็นเพียงแค่ว่าผมมีความส่วนตัวCalendarฟิลด์pubDate ฉันกำลังจะเขียน: Calendar getPubdate() { return pubdate; } แต่มีความเสี่ยงที่ผู้บุกรุกสามารถแก้ไขpubdateของฉันได้ดังนั้นฉันจึงส่งสำเนา: Calendar getPubdate() { return (Calendar) pubdate.clone(); } pubdate.clone()แล้วฉันสงสัยว่าทำไมผมต้องหล่อ ลายเซ็นวิธีมีประเภทที่นั่น NetBeansน่าจะสามารถเข้าใจได้ และNetBeansCollectionsดูเหมือนจะทำอะไรบางอย่างที่คล้ายกันในเรื่องเกี่ยวกับ

3
ความแตกต่างระหว่างการกำหนดเมื่อถึงตอนนั้น (GWT) และ Arrange Act Assert (AAA)?
ใน TDD มีไวยากรณ์จัดเรียง Assert (AAA): [Test] public void Test_ReturnItemForRefund_ReturnsStockOfBlackSweatersAsTwo_WhenOneInStockAndOneIsReturned() { //Arrange ShopStock shopStock = new ShopStock(); Item blackSweater = new Item("ID: 25"); shopStock.AddStock(blackSweater); int expectedResult = 2; Item blackSweaterToReturn = new Item("ID: 25"); //Act shopStock.ReturnItemForRefund(blackSweaterToReturn); int actualResult = shopStock.GetStock("ID: 25"); //Assert Assert.AreEqual(expectedResult, actualResult); } ในการทดสอบการเขียน BDD ใช้โครงสร้างที่คล้ายกัน แต่มีไวยากรณ์เมื่อเมื่อ (GWT): [Given(@"a …
13 c#  unit-testing  tdd  bdd 

1
อายุการใช้งานของวัตถุกับความหมายของการย้าย
เมื่อฉันเรียนรู้ C ++ นานมาแล้วมันเน้นอย่างมากกับฉันว่าส่วนหนึ่งของจุดของ C ++ คือเหมือนลูปมี "loop-invariants" คลาสยังมีค่าคงที่ที่เกี่ยวข้องกับอายุการใช้งานของวัตถุ - สิ่งที่ควรเป็นจริง เพราะตราบเท่าที่วัตถุยังมีชีวิตอยู่ สิ่งที่ควรกำหนดโดยผู้สร้างและเก็บรักษาไว้โดยวิธีการ การห่อหุ้ม / การควบคุมการเข้าถึงมีไว้เพื่อช่วยให้คุณบังคับใช้ค่าคงที่ Raii เป็นสิ่งหนึ่งที่คุณสามารถทำได้กับความคิดนี้ ตั้งแต่ C ++ 11 ตอนนี้เรามีความหมายย้าย สำหรับคลาสที่รองรับการย้ายการย้ายจากวัตถุไม่สิ้นสุดอย่างเป็นทางการตลอดอายุการย้ายควรจะปล่อยให้มันอยู่ในสถานะ "ถูกต้อง" บางอย่าง ในการออกแบบชั้นเรียนเป็นเรื่องที่ไม่ถูกต้องหรือไม่หากคุณออกแบบชั้นเรียนเพื่อให้ค่าคงที่ของชั้นเรียนถูกเก็บรักษาไว้จนถึงจุดที่ถูกย้ายออกไป หรือว่าไม่เป็นไรถ้ามันจะช่วยให้คุณทำให้มันเร็วขึ้น หากต้องการทำให้เป็นรูปธรรมสมมติว่าฉันมีประเภททรัพยากรที่ไม่สามารถคัดลอกได้ แต่เคลื่อนย้ายได้เช่น: class opaque { opaque(const opaque &) = delete; public: opaque(opaque &&); ... void mysterious(); void mysterious(int); void mysterious(std::vector<std::string>); }; และด้วยเหตุผลใดก็ตามฉันจำเป็นต้องทำ …

4
มีวิธีมาตรฐานหรือทางเลือกมาตรฐานในการบรรจุ struct ใน c หรือไม่?
เมื่อการเขียนโปรแกรมใน CI พบว่ามันมีค่ามากที่จะแพ็ค structs โดยใช้__attribute__((__packed__))แอตทริบิวต์GCCs ดังนั้นฉันสามารถแปลงกลุ่มของหน่วยความจำที่มีโครงสร้างเป็นอาร์เรย์ไบต์ที่จะส่งผ่านบัสได้อย่างง่ายดายบันทึกไปยังหน่วยเก็บหรือนำไปใช้กับบล็อกของรีจิสเตอร์ โครงสร้างแบบแพ็ครับประกันว่าเมื่อได้รับการปฏิบัติเป็นอาร์เรย์ไบต์จะไม่มีการบรรจุใด ๆ ซึ่งทั้งสองสิ้นเปลืองความเสี่ยงด้านความปลอดภัยที่เป็นไปได้และอาจเข้ากันไม่ได้เมื่อเชื่อมต่อกับฮาร์ดแวร์ ไม่มีมาตรฐานสำหรับโครงสร้างการจัดวางที่ทำงานได้ในคอมไพเลอร์ C ทั้งหมดหรือไม่? ถ้าไม่เช่นนั้นฉันคิดว่านี่เป็นคุณสมบัติที่สำคัญอย่างยิ่งสำหรับการเขียนโปรแกรมระบบ? ผู้ใช้ภาษา C ต้นไม่พบความต้องการโครงสร้างการจัดเก็บหรือมีทางเลือกบางอย่างหรือไม่?

1
มีวิธีปฏิบัติที่เป็นมาตรฐานสำหรับการสั่งซื้อแอตทริบิวต์ในแท็ก HTML หรือไม่
ฉันกำลังทำงานในโครงการ AngularJS และคุณลักษณะต่าง ๆ มากมายในองค์ประกอบ HTML ของฉัน: <button type="submit" ng-click="Page.UI.DetailView.ExecuteFunction()" ng-disabled="step5.$invalid" class="btn btn-success pull-right"> Submit this Product </button> มีแบบแผนมาตรฐานสำหรับการสั่งซื้อคุณลักษณะเหล่านี้หรือไม่ ตามตัวอักษร? จัดกลุ่มตามความหมาย (เช่นคุณลักษณะเชิงมุมทั้งหมดเข้าด้วยกัน)? คุณลักษณะ HTML มาตรฐาน ("ประเภท" เป็นต้น) ก่อน?

2
จะจัดการกับมันได้อย่างไรในทันใดนั้นความมุ่งมั่นที่กำลังดำเนินอยู่ดูเหมือนจะขึ้นกับสิ่งที่ยังไม่ได้ทำ?
ฉันไม่มีประสบการณ์กับ Git แต่ฉันพยายามอย่างดีที่สุดเพื่อทำความคุ้นเคยกับมันและจนถึงตอนนี้ฉันแค่ใช้มันสำหรับโครงการที่ฉันทำงานคนเดียว เมื่อฉันโค้ดจะมีวิธีการจากบนลงล่างตามธรรมชาติ (เพราะฉันไม่รู้อนาคต) และมีธีมที่ทำให้เกิดปัญหาซ้ำ: ฉันทำงานบางอย่าง ฉันพบว่าเพื่อให้งานของฉันเป็นเรื่องที่ "ยอมรับได้" ฉันต้องทำงานอื่น งานอื่น ๆ สมควรได้รับมันเป็นความมุ่งมั่นของตัวเอง ฉันหมายถึงสิ่งที่คอมไพล์หรือบางอย่างที่ไม่เป็นระเบียบ และโดยบางสิ่งที่สมควรได้รับมันเป็นความมุ่งมั่นของตัวเองฉันหมายถึงว่าฉันได้เรียนรู้ว่าการกระทำนั้นควรทำเพียงสิ่งเดียว วิธีที่ฉันแก้ไขมันยุ่งยาก หากงานอื่นอยู่ในไฟล์อื่นฉันจะสร้างสาขาใหม่ส่งที่นั่นและรวม หากงานอยู่ในไฟล์เดียวกัน .. ฉันทำสำเนาในเครื่องและรีเซ็ตไฟล์เป็นสถานะใน HEAD ให้ทำการคอมมิทที่จำเป็นแล้วเริ่มกู้คืนงานของฉันจากการคัดลอก ฉันจะจัดการกับสิ่งนั้นได้อย่างไร? ฉันไม่คิดว่านี่เป็นวิธีใช่มั้ย ฉันไม่คิดอย่างนั้นเพราะมันจะต้องเกิดขึ้นกับทุกคนบ้าง (ที่ไม่รู้อนาคตด้วยอย่างน้อย) หรืออาจดูเหมือนว่าขั้นตอนการทำงานของฉันมีแนวโน้มที่จะมีข้อบกพร่อง?
13 git 

1
แบบจำลองโดเมนในฐานข้อมูลสามารถเป็นทางออกที่ยั่งยืนได้หรือไม่
ฉันเพิ่งเริ่มงานใหม่ในฐานะผู้พัฒนาฐานข้อมูลสำหรับ บริษัท ขนาดกลาง - เล็กที่ใช้เทคโนโลยีของ Microsoft ฉันสังเกตเห็นตั้งแต่เนิ่นๆว่าการปฏิบัติที่เบี่ยงเบนไปจากสิ่งที่ฉันได้รับการสอนที่โรงเรียนเกี่ยวกับวิธีปฏิบัติที่ดีที่สุดรูปแบบการออกแบบการทดสอบและการจัดการโครงการ สิ่งที่ดักฟังฉันมากที่สุดคือวิธีที่ผู้พัฒนาฐานข้อมูลหลักของเรา (ต่อจากนี้เรียกว่า "จอห์น") จะเก็บแบบแผนโมเดลในฐานข้อมูล! เราทำสิ่งนี้โดยมีตาราง 3 "เวทมนตร์"; หนึ่งสำหรับฐานข้อมูลสกีมาสำหรับหนึ่งตารางและอีกหนึ่งสำหรับคอลัมน์ การแทรกเร็กคอร์ดลงใน " Tables " -table สร้าง (ผ่านทริกเกอร์ฐานข้อมูล), ตารางจริง, ที่สอดคล้องกัน การแทรกแถวในตาราง " แถว " จะเป็นการอัพเดตตารางที่อ้างอิงด้วยแถวนั้น สิ่งเหล่านี้กลับถูกอ่านโดย C # -program แบบโฮมเมดของเขาเพื่อสร้างแบบจำลอง C # ซึ่งถูกใช้โดย frontend-Developers สำหรับตัวควบคุมและด้านนอก นอกเหนือจากนี้การพัฒนาส่วนใหญ่จะทำตามกรอบASP.NET MVC ฉันเห็นข้อบกพร่องสองสามข้อด้วยวิธีนี้: เราต้องการให้เขารักษา ORM และเขาไม่ค่อยมีเวลาทำ (ความมั่นคงในการทำงานดีมาก! ทริกเกอร์สำหรับตาราง "ตาราง" และ "แถว" …

5
การทดสอบหน่วยเก่า / มรดกที่ชำรุด
ฉันทำงานกับ บริษัท ใหญ่และฉันรับผิดชอบงานจาวาแอพพลิเคชั่นขนาดใหญ่ที่มีการทดสอบ Junit นับพัน ตั้งแต่ฉันย้ายไปที่บทนี้มีการทดสอบแตก 200-300 ครั้ง (น่าจะพังได้หลายปี) การทดสอบนั้นเก่าและเปราะบางและพวกเขากำลังยุ่งเหยิงของการพึ่งพาสปาเก็ตตี้ที่มักจะจบลงด้วยข้อมูลแซนด์บ็อกซ์สด เป้าหมายของฉันคือการผ่านการทดสอบ 100% เพื่อให้เราสามารถสร้างความล้มเหลวในการสร้างหน่วยทดสอบ แต่ฉันไม่สามารถทำได้จนกว่าฉันจะจัดการกับการทดสอบที่เสียหาย ฉันมีงบประมาณน้อยมากเพราะงบประมาณการบำรุงรักษาเป็นสิ่งสำคัญสำหรับการสนับสนุน แต่ทีมของฉันได้ระบุและแก้ไขการทดสอบผลไม้แขวนลอยต่ำ (ส่วนใหญ่เป็นปัญหาการกำหนดค่า / ปัญหาทรัพยากรในท้องถิ่น) และเราลงไปทดสอบที่น่าเกลียด 30-40 อะไรคือความคิดเห็นเกี่ยวกับแนวปฏิบัติที่ดีที่สุด ฉันไม่คิดว่าการทดสอบนั้นมีค่า แต่ฉันก็ไม่รู้ว่าพวกเขากำลังทดสอบอะไรหรือทำไมพวกเขาถึงไม่ทำงานโดยไม่ต้องขุดซึ่งต้องใช้เวลาและเงินที่เราอาจไม่มี ฉันคิดว่าเราควรบันทึกสถานะของการทดสอบที่เสียหายด้วยสิ่งใดก็ตามที่เรารู้จากนั้นลบหรือเพิกเฉยต่อการทดสอบที่เสียหายทั้งหมดและป้อนข้อบกพร่องที่มีลำดับความสำคัญต่ำกว่า / รายการงานเพื่อตรวจสอบและแก้ไข จากนั้นเราจะอยู่ที่ 100% และเริ่มได้รับมูลค่าที่แท้จริงจากการทดสอบอื่น ๆ และหากเรามีโชคลาภการบำรุงรักษา / การปรับโครงสร้างใหม่เราจะสามารถรับได้อีกครั้ง อะไรคือแนวทางที่ดีที่สุด แก้ไข: ฉันคิดว่านี่เป็นคำถามที่แตกต่างจากคำถามนี้เพราะฉันมีทิศทางที่ชัดเจนสำหรับการทดสอบที่เราควรจะเขียนต่อไป แต่ฉันได้รับมรดกการทดสอบที่ล้มเหลวแบบดั้งเดิมที่จะอยู่ก่อนการทดสอบชุดใหญ่ในปัจจุบันจะมีความหมาย

3
ด้วยเหตุผลใดบ้างที่คุณจะใช้ส่วนขยายคลาสแยกต่างหากสำหรับตัวแทนแต่ละคนใน Swift
ฉันทำงานผ่านการสอนของ Ray Wenderlich และสังเกตว่าผู้เขียนใช้ส่วนขยายคลาสเพื่อระงับการโทรกลับแทนที่จะมอบหมายให้จัดการในคลาสเองเช่น: มอบหมาย callback ภายในส่วนขยายของชั้นเรียน: extension LogsViewController : UIPopoverPresentationControllerDelegate { func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { ... } } ตรงข้ามกับการมีอยู่ในชั้นเรียน: มอบหมายการเรียกกลับภายในชั้นเรียน: class LogsViewController : UITableViewController, UIPopoverPresentationControllerDelegate { func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { ... } } ฉันพบสิ่งนี้แปลกและน่าสนใจในเวลาเดียวกัน เขามีไฟล์เฉพาะสำหรับการขยายในคลาส LogsViewController ชื่อ "LogsViewControllerExtension.swift" และมีส่วนขยายที่แตกต่างกันสำหรับแต่ละโพรโทคอลของผู้แทน: UITableViewDataSource, UISplitViewDelegate …

4
วิธีทดสอบโค้ดที่ขึ้นอยู่กับ API ที่ซับซ้อน (เช่น Amazon S3)
ฉันกำลังดิ้นรนกับการทดสอบวิธีการอัปโหลดเอกสารไปยัง Amazon S3 แต่ฉันคิดว่าคำถามนี้ใช้กับ API / การพึ่งพาภายนอกที่ไม่สำคัญใด ๆ ฉันเพิ่งได้วิธีแก้ปัญหาที่อาจเกิดขึ้นสามข้อ แต่ก็ไม่น่าพอใจ: ทำการเรียกใช้รหัสอัปโหลดเอกสารตรวจสอบกับ API ของ AWS ว่ามีการอัปโหลดแล้วและลบออกเมื่อสิ้นสุดการทดสอบ สิ่งนี้จะทำให้การทดสอบช้ามากจะเสียค่าใช้จ่ายทุกครั้งที่ทำการทดสอบและจะไม่ส่งคืนผลลัพธ์เดียวกัน จำลอง S3 มันมีขนดกมากเพราะฉันไม่รู้ว่าภายในของวัตถุนั้นและรู้สึกผิดเพราะมันซับซ้อนเกินไป เพียงตรวจสอบให้แน่ใจว่า MyObject.upload () ถูกเรียกด้วยอาร์กิวเมนต์ที่ถูกต้องและมั่นใจว่าฉันใช้วัตถุ S3 อย่างถูกต้อง ทำให้ฉันรำคาญใจเพราะไม่มีทางรู้แน่ว่าฉันใช้ S3 API อย่างถูกต้องจากการทดสอบเพียงอย่างเดียว ฉันตรวจสอบว่า Amazon ทดสอบ SDK ของตัวเองอย่างไรและพวกเขาทำทุกอย่างเยาะเย้ย พวกเขามีผู้ช่วย 200 สายที่ทำหน้าที่เยาะเย้ย ฉันไม่รู้สึกว่ามันเป็นเรื่องจริงสำหรับฉันที่จะทำเช่นเดียวกัน ฉันจะแก้ปัญหานี้ได้อย่างไร
13 testing  mocking 

4
ฉันควรปรับใช้ 32- บิตเท่านั้นหรือทั้ง 32- และ 64- บิตเวอร์ชั่นสำหรับ Windows?
ฉันมีแอปพลิเคชันข้ามแพลตฟอร์มที่เขียนด้วยภาษาที่รวบรวม สำหรับ Linux มันเป็นธรรมเนียมที่จะต้องสร้างทั้ง amd64 และ i386 ให้กับผู้ใช้ดังนั้นผู้ใช้สามารถเลือกเวอร์ชั่นที่เหมาะสมกับสภาพแวดล้อมในปัจจุบัน ใน Mac มันเป็นธรรมเนียมในการสร้าง Universal Binary ดังนั้นจึงสามารถรองรับคอมพิวเตอร์ Apple หลายรุ่น หรือเพียงแค่ให้รุ่น 64 บิตเนื่องจากคอมพิวเตอร์ Apple ปัจจุบันทั้งหมดใช้สถาปัตยกรรม 64 บิตและระบบปฏิบัติการ ฉันไม่ต้องการให้ผู้ใช้สับสนโดยถามว่า "คุณเป็นผู้สร้างสถาปัตยกรรมอะไร" แต่การปรับใช้แบบ 32 บิตเป็นความคิดที่ไม่ดีเนื่องจากโปรแกรมนี้ใช้เวทมนตร์การเพิ่มประสิทธิภาพ 64 บิตและทำงานได้เร็วกว่าบนเครื่องเหล่านี้ ความคิดของฉัน: ติดตั้งแอปพลิเคชันทั้งรุ่น 32- บิตและ 64- บิตและเลือกในขณะใช้งาน (ต้องใช้ wrapper ดังนั้นการสร้างแอปพลิเคชันคลิกและเปิดใช้งาน (เช่น uTorrent) จะเป็นเรื่องยาก) ตรวจสอบสถาปัตยกรรมที่ใช้User-agentบนเว็บไซต์ดังนั้นผู้ใช้สามารถดาวน์โหลดเวอร์ชันที่เหมาะสมโดยอัตโนมัติ (และเชื่อมโยงไปยัง "เวอร์ชั่นอื่น") (เป็นสไตล์ของ Google Chrome) บังคับให้ผู้ใช้ใช้แอปพลิเคชัน 32 …

3
วิธีการวาดความสนใจของโปรแกรมเมอร์ในเงื่อนไขบางอย่าง?
เริ่มจากตัวอย่างกันก่อน สมมติว่าฉันมีวิธีที่เรียกexportว่าขึ้นอยู่กับ schema DB อย่างมาก และโดย“ พึ่งพาหนัก” ฉันหมายถึงฉันรู้ว่าการเพิ่มคอลัมน์ใหม่ในตารางหนึ่งบ่อยครั้ง (บ่อยครั้งมาก) จะนำไปสู่exportการเปลี่ยนแปลงวิธีการที่สอดคล้องกัน(โดยปกติแล้วคุณควรเพิ่มเขตข้อมูลใหม่ลงในข้อมูลการส่งออกด้วย) โปรแกรมเมอร์มักจะลืมที่จะเปลี่ยนexportวิธีการเพราะมันไม่ชัดเจนจริงๆคุณควรดูที่นี้ เป้าหมายของฉันคือการบังคับให้โปรแกรมเมอร์ตัดสินใจอย่างชัดเจนเพื่อตัดสินว่าเขาลืมดูexportวิธีการหรือไม่ต้องการเพิ่มเขตข้อมูลลงในข้อมูลการส่งออก และฉันกำลังมองหาโซลูชันการออกแบบสำหรับปัญหานี้ ฉันมีสองแนวคิด แต่ทั้งคู่มีข้อบกพร่อง เสื้อคลุม "อ่านทั้งหมด" สมาร์ท ฉันสามารถสร้าง wrapper อัจฉริยะที่ทำให้แน่ใจว่าข้อมูลทั้งหมดอ่านอย่างชัดเจน บางสิ่งเช่นนี้ def export(): checker = AllReadChecker.new(table_row) name = checker.get('name') surname = checker.get('surname') checker.ignore('age') # explicitly ignore the "age" field result = [name, surname] # or whatever checker.check_now() # check …

3
โทเค็นการเข้าถึง Oauth2 หลายรายการ
ฉันมี API ที่ใช้ oAuth2 และแอพมือถือของฉันเองที่ใช้ API นี้เป็นแบ็กเอนด์ เนื่องจากผู้ใช้สามารถเข้าสู่ระบบผ่านอุปกรณ์หลายตัว (เช่น iPhone, iPad, แท็บเล็ต Android หรือโทรศัพท์ Android) ในเวลาเดียวกันฉันจึงต้องใช้ API เพื่อแยกแยะระหว่างการเชื่อมต่อแต่ละครั้ง ฉันต้องการทำสิ่งนี้ผ่านโทเค็นการเข้าถึงแยกกัน: ลูกค้าแต่ละคนจะได้รับโทเค็นการเข้าถึงแยกต่างหาก ปัญหาคือการใช้งานปัจจุบันที่เราใช้ (spring-security-oauth2) สร้างคีย์ที่ไม่ซ้ำกันตาม client_id ชื่อผู้ใช้และขอบเขต ดังนั้นโดยทั่วไปเมื่อได้รับโทเค็นการเข้าถึงลูกค้าทั้งหมดจะได้รับโทเค็นการเข้าถึงเดียวกันสำหรับผู้ใช้เดียวกัน สิ่งนี้ทำได้โดยใช้ DefaultAuthenticationKeyGenerator ปลอดภัยหรือไม่หากไม่สนใจตัวสร้างคีย์การรับรองความถูกต้องและเพียงสร้างโทเค็นการเข้าถึงใหม่ในแต่ละคำขอจากลูกค้า
13 spring  oauth2 

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