2008-10-26 35 views
11

Ứng dụng của tôi sử dụng các công cụ đo lường được kết nối với PC. Tôi muốn làm cho nó có thể sử dụng các công cụ tương tự từ các nhà cung cấp khác nhau.Xác định phương thức giao diện có các tham số khác nhau

Vì vậy, tôi định nghĩa một giao diện:

interface IMeasurementInterface 
    { 
     void Initialize(); 
     void Close(); 
    } 

Cho đến nay rất tốt. Trước khi đo lường, tôi cần phải thiết lập các công cụ và điều này có nghĩa là các công cụ khác nhau các thông số rất khác nhau. Vì vậy, tôi muốn xác định phương pháp lấy các tham số có thể có các cấu trúc khác nhau:

interface IMeasurementInterface 
{ 
    void Initialize(); 
    void Close(); 
    void Setup(object Parameters); 
} 

Sau đó tôi sẽ truyền đối tượng đó tới bất kỳ thứ gì tôi cần. Đây có phải là con đường để đi?

+0

Bạn có dự định kiểm tra các lớp cụ cụ thể khác nhau hoặc bạn đang sử dụng mô phỏng và sửa đổi phần cứng không? – Kasper

+0

Tôi sẽ sử dụng các bài kiểm tra đơn vị – Enrico

Trả lời

0

Điều đó có thể hoạt động. Một tùy chọn khác là chuyển các tham số trong từ điển.

13

Bạn có thể nên sử dụng lớp "Tham số" trừu tượng được mở rộng theo từng thông số công cụ khác nhau ... ví dụ: và sau đó sử dụng Generics để đảm bảo rằng các thông số chính xác được truyền cho các lớp học đúng ...

public interface IMeasurement<PARAMTYPE> where PARAMTYPE : Parameters 
{ 
    void Init(); 
    void Close(); 
    void Setup(PARAMTYPE p); 
} 

public abstract class Parameters 
{ 

} 

Và sau đó cho mỗi thiết bị cụ thể,

public class DeviceOne : IMeasurement<ParametersForDeviceOne> 
{ 
    public void Init() { } 
    public void Close() { } 
    public void Setup(ParametersForDeviceOne p) { } 
} 

public class ParametersForDeviceOne : Parameters 
{ 

} 
+0

Các tham số phải là một giao diện, phải không? Tôi thích mô tả 'Cấu hình' hơn là thiết lập. – Egwor

+0

Cảm ơn câu trả lời của bạn, tuy nhiên điều này sẽ trả lời một câu hỏi khác. Trong mô hình của tôi, tôi có một trường riêng có tên là: MeasurementDevice phải là loại IMeasurement Nếu tôi muốn khởi tạo DeviceOne, hãy thực hiện: MeasurementDevice = new DeviceOne() Điều này không hoạt động (không thể chuyển đổi DeviceOne. – Enrico

+1

Khi bạn tạo thiết bị bạn sẽ cần phải biết loại thiết bị nó là để giữ một tham chiếu đến nó thông qua giao diện, do đó bạn mất sức mạnh của trừu tượng một chút –

2

Đối với tôi nó âm thanh như mô hình Factory có thể hữu ích, đặc biệt là nếu bạn đang đi để đơn vị kiểm tra ứng dụng của bạn.

1

Nếu bạn đang đi để đối phó với thậm chí nhiều hơn một loại thiết bị, sau đó điều khiển + thiết bị giao diện tách, mà giao tiếp bằng cặp Tên vlaue sẽ là một giải pháp tốt

tách

Sử dụng giá trị tên cặp cho phép bạn tách mã của bạn thành một thiết bị điều khiển + + mã ứng dụng cấu trúc

mẫu mã

class DeviceInterface 
    { 
    void Initialize(IController & Controller); 
    void Close(); 
    bool ChangeParameter(const string & Name, const string & Value); 
    bool GetParam(string & Name, string &Value); 
    } 

Mỗi thực hiện thiết bị, khi tạo nên được tạo ra với việc xác định các bộ điều khiển có thể chấp nhận các lệnh của nó và dịch chúng thành các thiết bị thực tế lệnh

interface IController 
    { 
    Initialize(DeviceSpecific & Params); 
    Close(); 
    bool ChangeParameter(string & Name, string & Value); 
    bool ChangeParams(string & Name[], string &Value []); 
    } 

mã người dùng của bạn sẽ giống như

này
IController  objController = new MeasurementDevice(MeasureParram); 

DeviceInterface MeasureDevice = new DeviceInterface(objController); 

string Value; 

MeasureDevice.GetParam("Temperature", Value); 

if (ConvertStringToInt(Value) > 80) 
    { 
    MeasureDevice.ChangeParameter("Shutdown", "True"); 
    RaiseAlert(); 
    } 

Tất cả những gì lớp DeviceInterface nên làm là cẩn thận truyền các lệnh tới bộ điều khiển. Bộ điều khiển nên chú ý đến giao tiếp của thiết bị.

Ưu điểm của giao diện tách

Protect againt thay đổi

này loại tách sẽ cho phép bạn để cô lập mã ứng dụng của bạn từ bộ điều khiển.Những thay đổi trong thiết bị không ảnh hưởng đến người sử dụng mã của bạn

năng bảo trì của appliction Mã

Addtionally mã người dùng luôn được sạch sẽ và bạn cần phải bận tâm duy nhất với logic ứng dụng. Nhưng bạn đã định nghĩa nhiều giao diện/tạo mẫu hoặc generics với nhiều kiểu tham số cụ thể cho bộ điều khiển, mã của bạn sẽ có rất nhiều thiết bị phụ thuộc vào nó, có thể làm tổn thương khả năng đọc và tạo ra các vấn đề bảo trì bất cứ khi nào thiết bị của bạn thay đổi.

dễ dàng thực hiện

Bạn cũng có thể chia ổ triển khai bộ điều khiển khác nhau vào các dự án riêng của mình. Ngoài ra, ứng dụng của bạn cũng có thể cấu hình các lệnh và phản hồi trong một naure động hơn bằng cách sử dụng các tệp XML, vv có thể gửi cùng với các lớp điều khiển sao cho toàn bộ ứng dụng của bạn trở nên năng động hơn trong tự nhiên.

Real Life

Một trong những dự án điều khiển sản xuất mới nhất từ ​​các nhà lãnh đạo trong phạm vi mà làm việc theo cách tương tự. Nhưng họ sử dụng LON để giao tiếp thiết bị.

LON?

LON giao thức được sử dụng trong điều khiển (nghĩ máy lạnh/nồi hơi/quạt vv) mạng sử dụng khái niệm này để nói chuyện với các thiết bị khác nhau

Vì vậy, tất cả những gì bạn sẽ cần phải có là một giao diện duy nhất có thể nói chuyện với thiết bị của bạn và sau đó gửi cặp giá trị tên tới nó bằng LON. ông sử dụng một giao thức chuẩn cũng sẽ cho phép bạn nói chuyện với các thiết bị khác ngoài công cụ đo lường của bạn. Có các triển khai mã nguồn mở LON khả dụng nếu thiết bị của bạn sử dụng LON.

Nếu thiết bị của bạn không hỗ trợ LON thì bạn có thể phải thiết kế thứ gì đó mà mã người dùng vẫn hoạt động trên cặp giá trị tên và giao diện ngược lại dịch các cặp giá trị tên thành một cotroller tương ứng tương ứng struct + và giao tiếp với thiết bị individua cách thiết bị hiểu được.

Hy vọng điều này hữu ích.

1

Nó phụ thuộc vào cách bạn sẽ nhận được các thông số ngay từ đầu. Nếu chúng được lưu trữ trong một bảng cơ sở dữ liệu hoặc một tập tin cấu hình một nơi nào đó và nó chỉ là giá trị cần phải được đặt sau đó đi qua trong một từ điển có thể sẽ làm điều đó (mặc dù bạn làm mất an toàn loại). Nếu các quá trình cài đặt của bạn sẽ phức tạp hơn một chút thì tôi sẽ xem xét trừu tượng quá trình thiết lập thêm một chút và thực hiện một công văn kép (đẩy hoạt động truyền vào một lớp thiết lập mới). Như thế này

public interface IMeasurementInterface 
{ 
    void Initialize(); 
    void Close(); 
    void Setup(IConfigurer config); 
} 

public interface IConfigurer 
{ 
    void ApplyTo(object obj); 
} 

public abstract ConfigurerBase<T> : IConfigurer where T : IMeasurementInterface 
{ 
    protected abstract void ApplyTo(T item); 

    void IConfigurator.ApplyTo(object obj) 
    { 
    var item = obj as T; 
    if(item == null) 
     throw new InvalidOperationException("Configurer can't be applied to this type"); 
    ApplyTo(item); 
    } 
} 

Bằng cách này bạn không làm rối phân cấp lớp đo lường (hoặc không cung cấp và giả định rằng mọi triển khai sẽ làm những gì bạn muốn). Điều này cũng có nghĩa là bạn có thể kiểm tra mã Thiết lập của mình bằng cách truyền một thiết bị Đo lường giả (hoặc Được giả lập).

Nếu quá trình thiết lập cần thao tác dữ liệu riêng tư hoặc được bảo vệ thì bạn có thể thực hiện cụ thể IConfigurer nằm trong lớp Đo lường tương ứng.

1

Tôi phải làm điều này cho phần mềm của mình vì tôi cần hỗ trợ nhiều loại bộ điều khiển chuyển động khác nhau cho máy cắt kim loại.

Giao diện của bạn có những điều cơ bản bạn cần. Điều bạn cần nhớ là bạn không cần phải chuyển vào danh sách các tham số. Bạn đã chỉ ra từng loại thiết bị có thể có một loại thiết lập rất khác.

Cách tôi làm điều đó như sau

interface IMeasurementInterface 
{ 
    void Initialize(); 
    void Close(); 
    void Setup(); 
    void Read (FileReader as <whatever read file object you are using>) 
    void Store (FileReader as <whatever read file object you are using>) 
    string Name(); 
} 

cài đặt gọi một hộp thoại được tạo ra trong lắp ráp các IMeasurementDevice. Hộp thoại KHÔNG hiển thị bên ngoài hội đồng.

Bây giờ tôi biết một số đối tượng theo định hướng hoặc MVC purist có thể phản đối điều này. Tuy nhiên tôi cảm thấy khái niệm ẩn nội bộ của một lớp Đo lường cụ thể vượt quá sự tuân thủ nghiêm ngặt đối với kiến ​​trúc MVC.

Triết lý chung của tôi là hộp thoại trival được triển khai trong cùng một assembly với điều kiện nó là riêng cho assembly và được gọi bởi một đối tượng thực hiện trên giao diện chuẩn mà tôi thiết lập. Một lần nữa lý do cho điều này là tôi thấy ẩn nội bộ để có giá trị hơn cố gắng để thực hiện tất cả các hộp thoại trong hội đồng cấp cao nhất.

Bằng cách chỉ định phương pháp đọc và phương pháp lưu trữ, bạn loại bỏ nhu cầu hiển thị các thông số cài đặt bên trong để lưu. Tất cả những gì bạn cần là chuyển bất kỳ loại đối tượng lưu trữ tệp nào bạn đang sử dụng để lưu các tham số thiết lập của mình.

Cuối cùng như một áp phích khác cho biết bạn cần phải thiết lập một lớp nhà máy trong lắp ráp của bạn có chứa tất cả các thiết bị đo lường của bạn. Trong quá trình thiết lập, bạn cần khởi tạo lớp này và truy xuất danh sách các thiết bị đo được hỗ trợ.

Cách tôi làm là lớp nhà máy của tôi truy xuất danh sách các bộ điều khiển chuyển động. Danh sách này là một phần của một lớp chủ nơi tất cả các lớp thiết lập được lưu trữ. Khi tôi đọc các tập tin cài đặt của mình, tôi nhận được các bộ điều khiển đang được sử dụng. Tôi lấy các lớp đó ra khỏi danh sách và đặt chúng vào một danh sách khác mà thực sự được sử dụng trong quá trình cắt.

Lý do tôi làm theo cách này là khi người dùng thiết lập bộ điều khiển chuyển động, người đó cần có thể chọn từ danh sách TẤT CẢ các điều khiển có sẵn để cho phần mềm mà người đó có. Tôi tìm thấy nó đáp ứng nhiều hơn để giữ một danh sách các bộ điều khiển có sẵn xung quanh.

+0

Điều này có thể làm việc, tuy nhiên tôi cần truyền một số tham số cấu hình từ UI, không cần mở hộp thoại. Tôi chỉ muốn thay đổi số điểm để đo lường tôi muốn làm điều đó từ giao diện người dùng chính chứ không phải từ thiết lập di alog.Do đó, tôi muốn Thiết lập chấp nhận tham số – Enrico

+0

Trong phần mềm của chúng tôi, chúng tôi có các Tiêu chuẩn Cửa hàng có thể truy cập từ mọi nơi trong phần mềm. Tôi khuyên bạn nên đặt tham số đó (và những thứ khác giống như nó) trong phiên bản của bạn về Tiêu chuẩn cửa hàng. –

+0

Tham số nào xảy ra khi tôi sử dụng quy tắc 1) Nếu nó liên quan đến TẤT CẢ các thiết bị của cùng một lớp. Đặt trong tiêu chuẩn Global Shop. 2) Nếu nó là cụ thể cho thiết bị ẩn nó đằng sau giao diện thiết bị. Trong trường hợp khác, bạn không cần phải vượt qua các thông số bổ sung thông qua thiết lập. –

Các vấn đề liên quan