objective c - 在REST Api中建模對象繼承



objective-c django (1)

沒有什麼說你的UI層中的類需要與你的域類匹配1對1。 就像你的域名類不需要完全遵循你的數據庫表一樣。

你可以將UI界面中的類作為一組不同的類來考慮。 您需要的類才能使您的用戶界面工作,或者需要使用框架,而不會影響域模型和/或數據庫設計中的業務規則。

您的用戶界麵類可能是一個包裝用戶和學生域類的類。 它將具有用戶和學生域類的知識。 然後由這個包裝類來實例化一個用戶或學生。

另一種方法是將用戶 - 學生關係建模為“有”關係而不是“是”。 畢竟,當用戶不僅可以成為學生,而且還可以成為老師時,你將要做什麼。 例如,當一位教師參加了他所教的課程以外的其他課程。 通常情況下,這種關係比角色更好地被建模,而不是“是”關係。 有關處理角色的更多信息,請參閱Martin Fowler。

在任何情況下,User UI類都將成為您在REST實現中的表示的基礎,並根據其是否與用戶或學生打交道來填充該表示中的額外部分,或者在基於角色的方法中,學生的東西:

{
  "user": "/users/1234",
  "name": "Some non student's name",
  "stats": {
    ...
  }
}, 
{
  "user": "/users/4567",
  "name": "Some Student's name",
  "stats": {
    ...
  }
  "papers": [
    { "paperid": "/users/papers/111"
      ...
    },
    { "paperid": "/users/papers/222"
      ...
    },
    { "paperid": "/users/papers/333"
      ...
    }
  ]
}

編輯回應評論

服務器無論如何都要在某個層次上決定,除非你想讓你的UI在URI層次上區分用戶和學生。 我建議反對。 它使得不可用的用戶界面。 用戶對實現細節不感興趣,也不希望遇到它們。

但是不, 如果不需要的話。

使用polymorfism你的優勢。

服務器可以將polymorfism很好地用於從它的數據訪問框架中為它通過id檢索的任何用戶接收一個學生實例。 畢竟學生總是可以被引用為用戶。 因此,服務器可以簡單地忽略用戶引用它從數據訪問框架獲得的可能是學生的事實。 當服務器真的需要做/添加特定的學生東西時,它應該在派生類中這樣做。

沒有,如果聲明需要在任何地方使用。 甚至不在UI類中。 用戶界面只需要知道它收到的用戶引用也可以是一個學生,並採取相應的行動。 最好不要通過if User is Student (這將綁在用戶界面的方式深入類層次),但if IUser implements IStudent :詢問用戶引用是否它也實現了學生接口,然後獲取和使用該IStudent接口參考。

問題

我有一個具有User對象和一個Student對象的應用程序。 有些用戶是學生。 所有學生都是用戶。 在數據庫(基於django-ORM)中,這被表示為一個Student表和一個User表的外鍵。

我正在嘗試創建一個REST API以及模擬此API的iOS應用程序中的對象層次結構。 我很難決定如何建模。

當前的解決方案

我所想到的最好的是:在iOS中有一個User模型,在iOS中有一個從User繼承的Student模型,並用更多的屬性擴展它。 然後,有一個方法從服務器接收JSON響應,並根據字典創建UserStudent模型。

最後,服務器將需要總是給我最具體的類型。 也就是說,當我登錄到服務器時,它將決定我是學生還是普通用戶,並將返回給我正確的字典。

這是最好的方法嗎?

這聽起來有點複雜。 但是我曾經想過對其進行建模的其他方式,例如改變數據庫的佈局方式,給了我一個數據庫不知道所有約束條件的設計。 例如, Student對象可以擁有其他對象(例如, homework_paper )。 我可以用一個外鍵來建模一個User對象而不是Student對象,並且說Student只是用戶的一個擴展。 但是這個數據庫並不強迫homework_paper必須由學生擁有。

有沒有更好的方法來解決我錯過的問題?





rest