Tôi có một số mã có nhiều trùng lặp khủng khiếp. Vấn đề xuất phát từ thực tế là tôi đang xử lý các loại lồng nhau IDisposable
. Hôm nay tôi có cái gì đó trông giống như:Làm thế nào một mã refactor có thể tham gia vào các ứng dụng lồng nhau?
public void UpdateFromXml(Guid innerId, XDocument someXml)
{
using (var a = SomeFactory.GetA(_uri))
using (var b = a.GetB(_id))
using (var c = b.GetC(innerId))
{
var cWrapper = new SomeWrapper(c);
cWrapper.Update(someXml);
}
}
public bool GetSomeValueById(Guid innerId)
{
using (var a = SomeFactory.GetA(_uri))
using (var b = a.GetB(_id))
using (var c = b.GetC(innerId))
{
return c.GetSomeValue();
}
}
Toàn bộ lồng nhau using
khối là như nhau cho mỗi một trong các phương pháp (hai được hiển thị, nhưng có khoảng mười trong số họ). Điều duy nhất khác biệt là những gì xảy ra khi bạn đi đến cấp độ bên trong của các khối using
.
Một cách tôi đã suy nghĩ sẽ làm điều gì đó dọc theo dòng:
public void UpdateFromXml(Guid innerId, XDocument someXml)
{
ActOnC(innerId, c =>
{
var cWrapper = new SomeWrapper(c);
cWrapper.Update(someXml);
});
}
public bool GetSomeValueById(Guid innerId)
{
var result = null;
ActOnC(innerId, c => { result = c.GetSomeValue(); });
return result;
}
private void ActOnC(Guid innerId, Action<TheCType> action)
{
using (var a = SomeFactory.GetA(_uri))
using (var b = a.GetB(_id))
using (var c = b.GetC(innerId))
{
action(c);
}
}
này hoạt động, nó chỉ là loại clunky để phân tích (như là một con người). Có ai có bất kỳ đề xuất nào khác về cách người ta có thể giảm sự sao chép mã xung quanh các khối using
lồng nhau như thế này không? Nếu chúng không phải là IDisposable
thì có thể chỉ cần tạo phương thức trả về kết quả là b.GetC(innerId)
... nhưng đó không phải là trường hợp ở đây.
+1 Tôi không thấy bất cứ điều gì phiền phức trong giải pháp của bạn. Đó là loại không chính thống được nhiều chức năng hơn thủ tục, nhưng tôi sẽ đếm nó như là một chuyên nghiệp, không phải là con – mfeingold
Tôi nghĩ rằng thực hiện của bạn có vẻ tốt nhưng có lẽ bạn sẽ thích một số lựa chọn thay thế được cung cấp dưới đây. Nếu bạn thấy mình phải chuỗi rất nhiều lần có thể tháo rời, bạn có thể muốn xem xét việc thiết kế lại những thứ để bạn không kết thúc trong tình huống này. – Thomas