2010-01-26 21 views
5

Tôi chỉ đọc post và nó làm cho trường hợp chống lại việc gõ ngầm khi sử dụng khi bắt đầu với thiết kế/phát triển theo hướng thử nghiệm.Nhập liệu ngầm và TDD

Bài đăng của anh ấy nói rằng TDD có thể bị "chậm lại" khi sử dụng nhập ẩn cho loại trả về khi đơn vị kiểm tra phương thức. Ngoài ra, anh ta dường như muốn loại trả về được chỉ định bởi thử nghiệm để thúc đẩy phát triển (điều này có ý nghĩa với tôi).

Một thử nghiệm đơn vị đưa ra với gõ ngầm có thể trông như thế này:

public void Test_SomeMethod() 
{ 
    MyClass myClass = new MyClass(); 

    var result = myClass.MethodUnderTest(); 
    Assert.AreEqual(someCondition, result); 
} 

Vì vậy, câu hỏi của tôi là:

Không sử dụng ngầm giúp đỡ đánh máy hoặc cản trở các bài kiểm tra viết đơn vị cho TDD? Có ai ngoài kia có thể chia sẻ kinh nghiệm của họ bằng cách sử dụng kỹ thuật này khi viết các bài kiểm tra đơn vị không?

Tôi hỏi điều này vì chẳng bao lâu tôi chưa thực hiện TDD và muốn biết nếu có cách viết các bài kiểm tra đơn vị chung hoặc bán chung sẽ làm việc kiểu trả về có thể thay đổi.

+0

@cmw - đó là giá trị chỉ ra rằng var vẫn mạnh mẽ gõ. Đó là trong đoạn mã của bạn, myClass vẫn thuộc loại MyClass và nếu bạn cố xử lý nó theo bất kỳ cách nào khác, bạn sẽ nhận được các lỗi biên dịch thời gian. Nhận xét khác của bạn khiến tôi nghĩ rằng có thể có chút nhầm lẫn về điều này. – Finglas

+0

@Dockers - thay đổi mã để phản ánh phần tôi quan tâm nhiều hơn. Tôi quan tâm nhiều hơn đến giá trị kết quả từ MethodUnderTest(). – cmw

Trả lời

3

Tôi thấy quan điểm của mình nhưng tôi không thực sự nghĩ đó là lý do chính đáng để không sử dụng var tại đây. Hãy nhớ rằng, TDD hoạt động gần như sau:

  1. Viết một thử nghiệm mới.
  2. Nếu thử nghiệm không biên dịch được (và nó sẽ thất bại!), Hãy viết đủ mã cho đến khi biên dịch thử nghiệm.
  3. Chạy tất cả các thử nghiệm.
  4. Nếu thử nghiệm không thành công, hãy viết đủ mã cho đến khi tất cả các thử nghiệm vượt qua.
  5. Refactor.

Có hay không chúng tôi sử dụng var thử nghiệm sẽ không biên dịch theo cách vì phương pháp được thử nghiệm sẽ không tồn tại! Khi chúng tôi bắt đầu mã hóa NewMethod, điểm của anh ấy là khá thú vị.

Đúng hơn, lý do chính đáng để không sử dụng var ở đây là do mã không cho biết loại result là gì. Đây là một vấn đề quan điểm nhưng var là okay đây

var dict = new Dictionary<Foo, List<Bar>>(); 

và với nhiều loại vô danh nhưng không ở đây

var m = M(); 

vì nó hoàn toàn không rõ ràng mà không đi đến tuyên bố M (hoặc sử dụng IntelliSense) những gì kiểu trả về là M.

+0

'SomeType m = M();' không nhất thiết phải rõ ràng hơn. 'm' là một tên biến khủng khiếp. Nếu bạn thay đổi nó thành một tên biến * tốt *, thì bạn vẫn cần phải xem loại? –

+0

loại thực tế nên bot là quan trọng. Đó là một chi tiết thực hiện và nên ở _not_ tốt nhất được biết ở dòng var m = M(); loại không có gì để làm với khả năng đọc mã. Tuy nhiên tên của biến sẽ được lặp lại mỗi khi nó được sử dụng và nên được lựa chọn cẩn thận –

+0

Tôi cũng có cùng suy nghĩ về bài kiểm tra. Một thử nghiệm đơn vị không biên dịch vẫn là một thử nghiệm. Nhưng theo như đánh máy ngầm, thì nó sẽ giúp ích khi kiểm tra kết quả trả về (tất nhiên là có tên biến mô tả)? Hoặc nên trả về kết quả được gõ một cách rõ ràng? – cmw

1

Có và Không

Trong Visual Studio hiện nay, TDD là một chút đau đớn, đặc biệt là khi sử dụng implicity gõ. var có nghĩa là không có intellisense, sau đó khi bạn nhập tên của một loại có thể không tồn tại nhưng nó có xu hướng tự động hoàn thành với một cái gì đó là tương tự với những gì bạn đang gõ, thường là tên của vật cố thử nghiệm.

Visual Studio 2010 có consume first mode, điều này làm cho nó trở nên lý tưởng và tốt hơn cho Phát triển theo hướng thử nghiệm.Hiện tại bạn sẽ tìm thấy (trong năm 2008 và trước đó) bạn phải nhấn thoát để ẩn nội dung.

Đối với sử dụng var đó là đường hoàn toàn synatic. Nó làm cho điều sau đây đẹp hơn nhiều theo ý kiến ​​của tôi:

var type = new MyType(); 

Rõ ràng là loại biến, thuộc loại MyType. var là rất tốt cho Generics và theo prinicple của DRY - Do not Repeat Yourself.

var type = MethodCall(); 

var result = ReturnResult(); 

Mặt khác, điều này làm cho mã khó đọc, dù bạn có theo TDD hay không. Các bài kiểm tra đơn vị tốt nên lưu thông và dễ đọc. Nếu bạn phải suy nghĩ, hoặc di chuột qua một phương thức để xem kiểu trả về, đó là dấu hiệu của một bài kiểm tra xấu, khó đọc.

+0

tại sao bạn nghĩ var type = MethodCall(); khó đọc? loại 'loại' nào nên thường (theo ý kiến ​​của tôi) không quan trọng để đọc mã (tên của biến khác, nên được chọn để tăng khả năng đọc) –

+0

Tôi đã thêm một ví dụ khác. Kết quả có thể là bất cứ điều gì, một chuỗi, int, đối tượng khác và như vậy. Ngay cả với một cái tên hợp lý, sự nhầm lẫn có thể xảy ra. * var * thật tuyệt vời, nhưng tốt nhất là không nên lạm dụng nó. – Finglas

0

Từ góc độ dụng cụ, tôi muốn nói rằng nó đẹp hơn để tránh những var. Tôi sử dụng Eclipse và Java, nhưng tôi biết rằng các phần mở rộng như CodeRush và Resharper cung cấp nhiều tính năng mà tôi đang thảo luận ở đây. Khi trong bài kiểm tra của tôi, tôi gọi một phương thức chưa tồn tại, tôi có thể "sửa nhanh" nó để tạo phương thức trong lớp mong muốn. Kiểu trả về của phương thức được tạo tự động phụ thuộc vào ngữ cảnh của nó; nếu tôi đang mong đợi trở lại một String, kiểu trả về của phương thức sẽ là String. Nhưng nếu gán là một var (mà Java không có - nhưng nếu nó đã làm), IDE sẽ không biết đủ để làm cho kiểu trả về bất cứ điều gì khác hơn là var (hoặc có thể là Object).

Không phải ai cũng sử dụng các IDE theo cách này trong TDD, nhưng tôi thấy nó rất hữu ích. Càng có nhiều thông tin tôi có thể cung cấp cho IDE trong bài kiểm tra của tôi, tôi càng phải gõ ít để thực hiện bài kiểm tra.

+0

Đôi khi tôi muốn VS2008 có một số tính năng mà Eclipse thực hiện. :-) – cmw

+0

@cmw - xem xét CodeRush & Resharper; họ có một số tính năng mà ngay cả người dùng Eclipse cũng có thể ghen tỵ. –