2012-03-26 10 views
8

Tôi đang phân tích ví dụ của tôi theo các thuật ngữ chung vì nó được điểm qua mà không phải đi vào chi tiết vấn đề cụ thể của tôi.Cách đánh máy mạnh mẽ cho các chuỗi hoặc các lớp được niêm phong khác

Giả sử bạn có một loạt các phương thức lấy chuỗi làm tham số. Giả sử rằng một chuỗi là "tên đầu tiên của một người" và một chuỗi khác là "họ" của một người. Có thể có những chuỗi khác như "món ăn yêu thích".

Bây giờ, trong mã của bạn, bạn tiếp tục tìm lỗi thời gian chạy vì bạn đang nhận được các thông số được trộn lẫn. Bạn có thể chuyển đổi thứ tự của "tên đầu tiên" và "họ" hoặc sử dụng một khi bạn nên sử dụng thứ tự khác. Giá trị của các ngôn ngữ gõ mạnh là nó sẽ tìm thấy các lỗi này tại thời gian xây dựng thay vì thời gian chạy.

Vì vậy, một giải pháp có thể là chỉ lấy được các lớp từ chuỗi.

public class FirstName : String 
{ 
} 

public class LastName : String 
{ 
} 

Bây giờ, nếu bạn truyền nhầm loại chuỗi trình biên dịch sẽ khiếu nại. Điều trên không thể thực hiện được vì String được niêm phong. Ngoài ra, câu lệnh "using" sẽ không hoạt động (tôi nghĩ) vì trình biên dịch sẽ không phàn nàn khi tôi trộn chúng lên.

using LastName = String; 

Chắc chắn, tôi có thể tạo các lớp bọc chuỗi và sau đó viết phương pháp chuyển đổi truyền, nhưng điều đó có vẻ rắc rối hơn giá trị.

+2

Vui lòng không thêm tiền tố cho tiêu đề của bạn bằng "C#". Đó là những gì các thẻ cho. –

+0

Tại sao không sử dụng các đối số được đặt tên (được giới thiệu trong phiên bản VS2010 của C#) để tránh việc chuyển đổi hoặc sắp xếp các vấn đề tham số, thay vì chỉ làm cho cuộc sống khó khăn hơn khi gõ mạnh hơn? http://msdn.microsoft.com/en-us/library/dd264739.aspx –

Trả lời

1

Chỉ cần đừng quên để làm cho các lớp học khác như

A-FileStreamReader : StreamReader 
B-FileStreamReader : StreamReader 
Age : int 
Phone : long 
... 
... 
SLaksPhoneNumer : string // added under pressure...  

Các giải pháp được, hãy gọi phương pháp với các thông số đúng, khi phương pháp này yêu cầu firstName cho nó và không LastName ...

Bằng cách này, Điều gì sẽ ngăn cản bạn làm (trong thời gian biên dịch hoặc trong RUNTIME):

new FirstName("Skeet"); 
new LastName("Jon"); 
+2

_Số điện thoại là các chuỗi, không phải là longs_ – SLaks

+1

@SLaks. Đã chỉnh sửa. Hài hướC++ – gdoron

+1

"Đừng phạm sai lầm". Bây giờ tại sao tôi không nghĩ về điều đó: ^) – ChuckZ

0

Thật khó để nói chính xác những gì câu hỏi của bạn là.

Ví dụ: nếu bạn có một phương thức, có 6 tham số chuỗi và có thể trong tương lai mất 7, có lẽ bạn nên tạo một đối tượng được nhập mạnh có 6 thuộc tính liên quan (trong tương lai bạn có thể mở rộng để thêm thứ 7 - obviating sự cần thiết phải sửa đổi chữ ký trên phương pháp). Sau đó, phương thức của bạn chỉ có thể chấp nhận một tham số, là đối tượng được đánh máy mạnh của bạn có chứa các tham số có liên quan cho phương thức của bạn.

2

Bây giờ, trong mã của bạn, bạn tiếp tục tìm lỗi thời gian chạy vì bạn đang nhận được các tham số được trộn lẫn. Bạn có thể chuyển đổi thứ tự của "tên đầu tiên" và "họ" hoặc sử dụng một khi bạn nên sử dụng thứ tự khác. Giá trị của các ngôn ngữ gõ mạnh là nó sẽ tìm thấy các lỗi này tại thời gian xây dựng thay vì thời gian chạy.

Thật khó để biết câu hỏi của bạn thực sự là là gì. Do đó, phải có một số trách nhiệm của về phía nhà phát triển. Chính xác có bao nhiêu thông số mà chúng ta đang nói đến ở đây? Nếu bạn có nhiều hơn một vài thông số, điều đó thường có nghĩa là bạn cần phải cấu trúc lại mã của mình. Ví dụ:

void MyMethod(string firstName, stringMiddleName, string lastName, 
string phoneNumber, string email, string country, string city, 
string state, string zipcode, string countryISO, 
string pseudonym, string title, string addressLine1, string addressLine2) 

Rõ ràng là phức tạp.Tạo một gói đối tượng ContactInfo nhất nếu không phải tất cả những thông số, và sau đó bạn có thể viết:

void MyMethod(ContactInfo contact) 

EDIT:

Bạn có thể, nếu bạn đang sử dụng VS2010, sử dụng tên tính năng thông số. Điều này cho phép bạn chuyển chúng theo một thứ tự khác.

string ConcatName(string firstName, string lastName) 
{ 
    return (firstName + " " + lastName); 
} 

string myName = ConcatName(lastName: "Crosby", firstName: "Bryan") 

Output:

Bryan Crosby

tôi vẫn sẽ xem xét mã của bạn chặt chẽ và xem nếu bạn có thể cấu trúc lại các phương pháp (s) và các lớp học.

2

Tôi không biết mục tiêu của bạn là gì, nhưng bạn có vẻ nghiêm túc về nó :) Vì vậy, một giải pháp có thể là sử dụng một lớp container chung. Nó thực sự sẽ ít thoải mái hơn so với kế thừa từ các lớp kín.

public class Container<T> 
{ 
    public T Value { get; protected set; } 

    public Container(T value) 
    { 
     Value = value; 
    } 
} 

public class FirstName : Container<string> 
{ 
    public FirstName(string firstName) : base(firstName) { } 
} 

public class LastName : Container<string> 
{ 
    public LastName(string lastName) : base(lastName) { } 
} 

public class Age : Container<int> 
{ 
    public Age(int age) : base(age) { } 
} 

public class Program 
{ 
    public void Process(FirstName firstName, LastName lastName, Age age) 
    { 

    } 
} 
+0

Bạn đã nhận nó ở đây. Đây là những gì tôi đang tìm kiếm. – ChuckZ

+0

@ChuckZ. Vì vậy, bạn sẽ có hàng ngàn lớp học cho mỗi lần sử dụng? – gdoron

+0

Tôi chắc chắn anh ấy có lý do chính đáng để sử dụng điều này :) – MatthiasG