Tôi đã đọc một cuốn sách C# trong đó tác giả (một số anh chàng tên là Jon Skeet) thực hiện một chức năng Where
nhưCác chức năng riêng biệt thành xác thực và triển khai? Tại sao?
public static IEnumerable<T> Where<T> (this IEnumerable<T> source, Funct<T,bool> predicate)
{
if (source == null || predicate == null)
{
throw new ArgumentNullException();
}
return WhereImpl(source, predicate);
}
public static IEnumerable<T> WhereImpl<T> (IEnumerable <T> source, Func<T,bool> predicate)
{
foreach (T item in source)
{
if (predicate(item))
{
yield return item;
}
}
}
Bây giờ, tôi hoàn toàn hiểu cách làm việc này và rằng nó tương đương với
public static IEnumerable<T> Where<T> (this IEnumerable<T> source, Funct<T,bool> predicate)
{
if (source == null || predicate == null)
{
throw new ArgumentNullException();
}
foreach (T item in source)
{
if (predicate(item))
{
yield return item;
}
}
}
đưa ra câu hỏi về lý do tại sao một người sẽ tách biệt chúng thành 2 chức năng cho rằng sẽ có bộ nhớ/thời gian trên đầu và tất nhiên là mã. Tôi luôn luôn xác nhận các thông số và nếu tôi bắt đầu viết như ví dụ này thì tôi sẽ viết nhiều gấp hai lần mã. Có một số trường học của tư tưởng nắm giữ rằng xác nhận và thực hiện nên được chức năng riêng biệt?
BTW sử dụng * Hợp đồng mã * có lẽ sẽ không phải là một lý do thực sự để tách chúng thành hai phương thức, vì xác thực thông số sẽ được thực hiện bằng cách sử dụng điều kiện trước ... Tôi không thể kiểm tra điều này ngay bây giờ, nhưng tôi không chắc chắn nếu * hợp đồng mã * cũng sẽ được đánh giá như một phần của khối lặp –
Vâng, cuối cùng tôi đã thử nghiệm nó bản thân mình, tôi đã tò mò về kịch bản tôi đã nói với bạn trong phần bình luận ở trên. Tôi đã đăng câu trả lời của riêng mình để đóng góp với ngoại lệ này cho quy tắc –