2017-03-04 111 views
-1

假設我有一個像Student這樣的實體,並且使用MVC模式,我在我的項目中創建了一個學生模型。但是在某些時候,當我創建一個表時,我獲得了另一個實體的外鍵。 (一對多關係 - 學生借書) 因此,當我創建Book Model時,必須將外鍵作爲Book類的一個屬性。那麼它違反了MVC模式? 請幫忙。 如何使用MVC實現這一點?MVC模式中的模型和實體有什麼區別?

+0

不包括外鍵作爲屬性不違反MVC模式。術語實體通常在創建實體關係圖時出現。模型是MVC中的M.在你的例子中,學生會參考一個實體,如果你遵循MVC實現,你也會有一個模型。 –

回答

2

不,它不違反MVC。

根據定義,MVC中的「Model」表示應用程序中數據的邏輯表示。建立實體關係(在你的情況下,學生和書)是一種代表學生信息的方式。

說,我正在「學校圖書館」上構建一個Web應用程序。

  1. 實體(學生和書)關係將是「模型」的所有部分。
  2. 現在,有一個門戶網站(或簡單的網頁),學生可以檢查他借來的圖書,是一個「視圖」。
  3. 連接模型和視圖的類(編寫爲從模型中獲取數據並渲染它的視圖)寫在「控制器」中。

檢查Web框架,如Django,Laravel。他們遵循MVC範式來構建複雜的Web應用程序。

希望它有幫助。

+0

因此,如果我在BookModel.java類中包含Student的String id,這不會是一個問題?可以在模型類中包含另一個模型作爲屬性嗎? – Parker

+0

它絕對不會違反所述的模型。書中沒有「外鍵」。 –

+0

@Parker,模型應該反映它描述的世界。一本書有一個學生,還是一個學生有書? –

1

讓我們來備份吧。 「MVC」是「Model-View-Controller」;三者中的每一個都是不同的部分。模型是你的問題的主題,是描述你程序世界的部分。該模型包含您的問題空間的名詞,形容詞和動詞,或「話語領域」。只能使用屬於該域的名詞,形容詞和動詞。代表演員或實體(名詞)及其屬性(名詞和形容詞)和行爲(動詞)的領域相關類型的結構就是您的模型。

在您的域名中,您提到了兩個名詞和一個動詞。 「學生借書」。現在我從來沒有見過一個擁有外鍵的學生。 (除非是他們交換學生女朋友的公寓。)也不是一本書。所以「外鍵」不是模型的一部分。

這裏的一個模型:

public interface Person { 
    String getName(); 
} 

public interface Borrower<T> { 
    void borrow(T thing); 
} 

public interface Replacer<T> { 
    void replace (T thing); 
} 

public class Student implements Person, 
    Borrower<Book>, Replacer<Book> { 
    private final Set<Book> bookshelf = new HashSet<>(); 

    public Collection<Book> getBookshelf() { 
    return Collections.unmodifiableSet(bookshelf); 
    } 

    // more implementation 
} 

我故意分解模型爲單抽象方法(SAM)的接口。但是,Person界面通常不是典型的界面。動作方法,諸如「借用」和「替換」等傳遞動詞應該是SAM接口,部分是爲了支持lambda表達式,部分是爲了保持模型的清晰和簡單。

相關問題