ฉันได้รับรหัสฐานซึ่งมีรหัสจำนวนมากที่ไปในลักษณะนี้:
SomeDataAdapter sda = new SomeDataAdapter();
sda.UpdateData(DataTable updateData);
จากนั้น sda จะไม่ถูกใช้อีกครั้ง
เป็นกลิ่นรหัสที่บ่งชี้ว่าวิธีการเหล่านั้นควรเป็นวิธีการเรียนแบบคงที่แทน?
ฉันได้รับรหัสฐานซึ่งมีรหัสจำนวนมากที่ไปในลักษณะนี้:
SomeDataAdapter sda = new SomeDataAdapter();
sda.UpdateData(DataTable updateData);
จากนั้น sda จะไม่ถูกใช้อีกครั้ง
เป็นกลิ่นรหัสที่บ่งชี้ว่าวิธีการเหล่านั้นควรเป็นวิธีการเรียนแบบคงที่แทน?
คำตอบ:
ฉันจะพิจารณาว่ากลิ่นสถาปัตยกรรมใน UpdateData นั้นน่าจะเป็นของคลาส 'service'
ข้อมูลอยู่ที่ไหนของ Apple ตำแหน่งที่ AppleAdapter เป็นคลาสบริการ / ข่าวกรองธุรกิจ โดยที่ AppleService เป็นการอ้างอิง Singleton ไปยัง AppleAdapter ที่มีอยู่นอกเมธอดปัจจุบัน
private static volatile AppleAdapter _appleService = null;
private static object _appleServiceLock = new object();
private AppleAdapter AppleService
{
get
{
if (_appleService == null)
{
lock (_appleServiceLock)
{
if (_appleService == null)
_appleService = new AppleAdapter();
}
}
return _appleService;
}
}
public SomeAppleRelatedMethod(Apple apple)
{
AppleService.UpdateData(apple);
}
ฉันไม่คิดว่าสิ่งที่คุณกำลังทำนั้นผิด แต่ถ้า SomeDataAdapter แทนบริการธุรกิจไร้สัญชาติอย่างแน่นอนแล้วซิงเกิลก็น่าจะเป็นแนวทางที่ดีที่สุดสำหรับมัน หวังว่าจะช่วย! ตัวอย่างที่ให้มาเป็นวิธีแฟนซีเพื่อให้แน่ใจว่าไม่มีการช่วงชิงของ _appleService หากเกิดขึ้นเป็นทั้งโมฆะและเข้าถึงได้ในเวลาเดียวกันโดยเธรดอย่างน้อยสองเธรด
คุณรู้อะไรไหม? ถ้า SomeDataAdapter เป็น ADO IDbDataAdapter (ซึ่งเกือบจะแน่นอน), ไม่สนใจคำตอบทั้งหมดนี้!
: P
ฉันไม่ได้รับอนุญาตให้เพิ่มความคิดเห็นในคำถามเดิม แต่ถ้าคุณสามารถระบุได้ว่ามีรหัสนี้อยู่ที่ไหน
หากรหัสนี้แสดงถึงการนำไปใช้งานแบบกำหนดเองของ IDbDataAdapter และ UpdateData กำลังสร้าง IDbConnection, IDbCommand และเดินสายไปตามหลังฉากแล้วฉันไม่คิดเลยว่าจะมีกลิ่นรหัสเพราะตอนนี้เรากำลังพูดถึงสตรีมและอื่น ๆ สิ่งที่ต้องกำจัดเมื่อเราใช้งานเสร็จแล้ว
ฉันคิดว่าปัญหานี้ยิ่งลึกไปกว่านั้น แม้ว่าคุณจะทำการปรับเปลี่ยนใหม่เป็นวิธีคงที่คุณจะได้รับรหัสที่คุณเรียกใช้วิธีการคงที่เดียวทั่วสถานที่ ซึ่งในความคิดของฉันคือกลิ่นรหัสในตัวเอง มันอาจบ่งบอกว่าคุณขาดสิ่งสำคัญบางอย่างไป บางทีคุณอาจต้องการสร้างรหัสที่จะทำก่อนและหลังการประมวลผลในขณะที่ช่วยให้คุณสามารถเปลี่ยนแปลงสิ่งที่เกิดขึ้นระหว่าง ก่อนและหลังการประมวลผลจะมีการเรียกทั่วไปในขณะที่ในระหว่างจะขึ้นอยู่กับการใช้งานเป็นรูปธรรม
ชนิดของ มันมักจะหมายความว่าคุณต้องการผ่านฟังก์ชั่นไปรอบ ๆ และภาษาที่คุณเลือกจะไม่ยอมให้คุณ มันค่อนข้างงุ่มง่ามและไม่เหมาะ แต่ถ้าคุณติดอยู่ในภาษาที่ไม่มีฟังก์ชั่นชั้นหนึ่งคุณก็สามารถทำอะไรได้มากมาย
หากวัตถุเหล่านั้นไม่ได้รับการส่งผ่านเป็นอาร์กิวเมนต์ไปยังฟังก์ชั่นอื่น ๆ คุณสามารถเปลี่ยนพวกเขาเป็นวิธีคงที่และไม่มีอะไรจะเปลี่ยนแปลง
fn x => x + 1
และnew Function<Integer, Integer>() { public Integer eval(Integer x) { return x + 1; }};
หรือ จำกัด ตัวคุณเองกับฟังก์ชั่นที่ใช้รหัสยากและมีประโยชน์น้อย
fn x => x + 1
น้ำตาล syntactic ถึงnew Function<Integer, Integer>() { public Integer eval(Integer x) { return x + 1; }}
ไม่ได้? โอเคบางทีคุณอาจหมายถึงว่ามีคนติดอยู่ในภาษาที่ไม่มีประโยคน้ำตาลแบบนี้
หากสถานะการถือครองทำให้ชั้นที่กำหนดเป็นประโยชน์มากขึ้นฟังก์ชั่น ... ใช้งานได้อีกครั้งแล้วไม่ใช่ ด้วยเหตุผลบางอย่างรูปแบบการออกแบบคำสั่งก็คำนึงถึง เหตุผลนั้นไม่ใช่ความปรารถนาที่จะให้โรเบิร์ตฮาร์วีย์จมน้ำตาย
กำหนด "บ่อยครั้ง" วิธีมักจะทำคุณ instantiate วัตถุ? มาก - อาจจะไม่?
มีปัญหาใหญ่ที่น่าเป็นห่วงในระบบของคุณ การเคลื่อนที่แบบคงที่จะสื่อสารกับโปรแกรมเมอร์อย่างชัดเจนมากขึ้นว่าสถานะภายในของวัตถุไม่เปลี่ยนแปลง - เยี่ยมยอด
หากสภาวะยุ่งเหยิง แต่คุณต้องเริ่มทำสิ่งอื่น ๆ ให้คงที่เพื่อทำให้สิ่งแรกคงที่จากนั้นคุณต้องถามว่าส่วนใดที่จำเป็นต้องคงที่และส่วนใดทำไม่ได้
ใช่มันเป็นกลิ่นรหัสเพียงเล็ก ๆ
ทำให้เป็นวิธีการคงที่และไปต่อ ไม่มีอะไรผิดปกติกับวิธีการคงที่ เมื่อรูปแบบการใช้งานเกิดขึ้นคุณสามารถกังวลเกี่ยวกับการทำให้รูปแบบเป็นนามธรรม
กลิ่นนี่คือสิ่งนี้เป็นรหัสขั้นตอนห่อ (น้อยที่สุด) ในวัตถุ
ต้องมีเหตุผลที่คุณต้องการดำเนินการนั้นในตารางข้อมูล แต่แทนที่จะสร้างแบบจำลองการดำเนินการนั้นกับการดำเนินการอื่น ๆ ที่เกี่ยวข้องซึ่งมีความหมายบางอย่างร่วมกัน (เช่นมีความหมายทั่วไป) ผู้เขียนเพียงหมุนขั้นตอนใหม่ภายในใหม่ คลาส & เรียกมันว่า
ในภาษาที่ใช้งานได้นั่นเป็นวิธีที่คุณจะทำ;) แต่ในกระบวนทัศน์ของ OO คุณต้องการสร้างแบบจำลองนามธรรมที่รวมการดำเนินการนั้น จากนั้นคุณจะใช้เทคนิค OO เพื่อแยกแยะรูปแบบนั้นและจัดเตรียมชุดของการดำเนินการที่เกี่ยวข้องซึ่งเก็บรักษาความหมายบางอย่างไว้
ดังนั้นกลิ่นหลักของที่นี่คือผู้เขียนใช้คลาสบางทีอาจเป็นเพราะคอมไพเลอร์ต้องการ
BTW ระวังตลอดเวลาที่คุณดูโปรแกรมที่ถูกจำลองแทนของพื้นที่ปัญหา มันเป็นสัญญาณว่าการออกแบบจะได้ประโยชน์จากความคิดที่มากขึ้น ในคำอื่น ๆ ดูออกสำหรับทุกชั้นเป็นอยู่ "xAdaptor" และ "xHandler" และ "xUtility" และมักจะเชื่อมโยงกับรูปแบบโดเมนโรคโลหิตจาง หมายความว่ามีใครบางคนกำลังรวบรวมรหัสเพื่อความสะดวกซึ่งต่างจากการสร้างแบบจำลองแนวคิดที่ต้องการนำไปใช้จริง