2010-07-29 33 views
6

Tôi đang cố gắng phát triển một khung công tác cho một số ứng dụng mà chúng tôi đang phát triển ở đây và một trong các lớp khung mà tôi đang cố gắng xây dựng để tạo cơ sở dữ liệu. Lý tưởng nhất, tôi sẽ có một phương pháp mà tôi có thể vượt qua nó hai phương pháp sau đây: CreateDatabaseTables() và ResetDatabaseValues ​​();Chuyển nhiều phương thức (delegate?)

Ví dụ, tôi có thể có ba ứng dụng mà tôi sẽ gọi Application1, Application2 và Application3; mỗi ứng dụng này sẽ có một lược đồ cơ sở dữ liệu khác nhau mà tôi sẽ kết hợp thành mã (ví dụ: CreateDatabaseTables có một loạt các lệnh "Tạo bảng"). Tôi muốn tạo ra một phương pháp cơ sở dữ liệu duy nhất có thể được sử dụng bởi mỗi người trong số những cái nó sẽ giống như thế:

Application1

BuildLocalDatabase(CreateTablesForApp1(),ResetDatabaseValuesforApp1()) 

Application2

BuildLocalDatabase(CreateTablesForApp2(),ResetDatabaseValuesforApp2()) 

Application3

BuildLocalDatabase(CreateTablesForApp3(),ResetDatabaseValuesforApp3()) 

Phương thức BuildLocalDatabase sẽ thực hiện như sau:

publid bool BuildLocalDatabase(CreateTablesForApp(),ResetDatabaseValuesforApp()) 
{ 
    - see if database file exists; if it does, delete it 
    - create a new database file 
    - call CreateTablesForApp 
    - if the tables were created successfully, call ResetDatabaseValuesForApp 
} 

Bất kỳ suy nghĩ nào về cách tôi có thể thực hiện việc này. Thực tế là một loạt các xác nhận và các thứ khác mà tôi muốn thực hiện trong hàm BuildLocalDatabase và rõ ràng là mục tiêu của tôi ở đây là giảm thiểu số lượng mã trùng lặp trong mỗi ứng dụng ... bất kỳ đề xuất nào về cách thực hiện điều này. Tôi nghĩ rằng trong C + +, tôi có thể có chỉ cần thông qua các CreateTablesForApp và ResetDatabaseValuesForApp phương pháp như các điểm chức năng, nhưng nó không có vẻ như có một cách để làm điều này trong C#. Và các đại biểu dường như xử lý nó tốt vì tôi thực sự chỉ giới hạn trong một phương thức (và multicast dường như muốn chạy các phương thức hai lần).

+1

Bạn có thể muốn xem xét định dạng mã trong câu hỏi của mình để mọi người có thể đọc nó dễ dàng hơn. –

Trả lời

4

Bạn sẽ muốn sử dụng các đại biểu:

public bool BuildLocalDatabase(Func<Database, bool> createTables, Action<Database> resetValues) 
{ 
    // Do initialization 
    if (createTables(db)) 
    { 
      resetValues(db); 
    } 
} 

Bạn muốn sau đó gọi này như:

BuildLocalDatabase((db) => CreateTablesForApp1(), (db) => ResetDatabaseValuesforApp1()); 

(tôi đặt trong một tham số "Cơ sở dữ liệu" trong trường hợp bạn cần nó - nếu bạn không, bạn chỉ có thể sử dụng Func<bool>Action, không có tham số đó, và chỉ cần chuyển trực tiếp tên phương thức thay vì lambdas.Thông thường các phương pháp như thế này cần một số dạng tham số, chẳng hạn như kết nối DB, v.v. đặt nó vào.)

+0

Reed, Cảm ơn phản hồi của bạn - nó hoàn hảo. Tuy nhiên, trong suy nghĩ về điều này, tôi đã tự hỏi nếu bạn sẽ tiếp cận vấn đề theo cách này hay cách khác (kể từ khi bạn trả lời câu hỏi ban đầu của tôi "tại chỗ", tôi sẽ làm cho giả định bạn biết những gì tôi cố gắng làm). Vì vậy, bạn có nghĩ rằng tôi nên sử dụng phương pháp "Func" mà bạn đã mô tả hoặc tạo một lớp cơ sở dữ liệu "cơ bản" mà tôi có thể "lấy được" một lớp mới cho mỗi applciation. Lớp "có nguồn gốc" này sẽ có mã "dành riêng cho ứng dụng" ... Cảm ơn bạn lần nữa ... – user405965

+0

@ ed92620: Nó thực sự phụ thuộc. Sử dụng một lớp (hoặc giao diện!) Cho điều này thay vì 2 đại biểu có thể thích hợp hơn, nhưng nó có thể không, là tốt. Thật khó để biết điều gì là tốt nhất mà không có nhiều thông tin chi tiết hơn, và ý thức tốt về dự án của bạn. Cá nhân, nếu số lượng mã nhỏ, tôi thích các đại biểu - nếu nó ở tất cả các lớn, sử dụng một lớp học có lẽ là tốt hơn, nếu không có lý do khác hơn là nó nhiều hơn testable. –

1

Vâng, về cơ bản bạn có thể. Nếu câu hỏi là về đại biểu syntac, bạn cần phải mất một vài () và xác định một đại biểu:

public delegate void MyDelegate(); 

publid bool BuildLocalDatabase(MyDelegate CreateTablesForApp, MyDelegate ResetDatabaseValuesforApp) 
{ 
    CreateTablesForApp(); 
    ... 
    ResetDatabaseValuesforApp(); 
} 

và gọi nó là thích:

BuildLocalDatabase(CreateTablesForApp1,ResetDatabaseValuesforApp1); 
+2

Đối với một đại biểu trống như thế không nên bạn chỉ cần sử dụng được xây dựng trong đại biểu 'Hành động'? –

+0

@Gordon: Có, nhưng tôi quyết định hiển thị cú pháp đầy đủ có liên quan. –

+1

Tôi thích cú pháp đại biểu đầy đủ trong hầu hết các trường hợp - một đại biểu được đặt tên đúng nói với người lập trình một cái gì đó về những gì mà người được ủy nhiệm và làm thế nào để được thực hiện. Một "Hành động" đơn giản không có mô tả đó - bạn cuối cùng cũng để lại nó cho tên cá thể để mô tả điều đó nữa - nhưng cá thể phải mô tả chính nó. –

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