2017-06-16 72 views
0

我是O.O.P的新手,並希望提供有關最佳實踐的建議。O.O.P和類屬性

說例如我有一個課程課程,其中包含課程信息,和一個位置類,其中包含位置的詳細信息。類具有相應的存儲庫類。現在,每個課程都有一個位置,我已將位置添加爲屬性。

當我從數據庫中提取課程的細節,是它的最佳實踐: A - 填充從CourseRepository類意味着SQL中的位置對象將同時返回路線和位置信息 乙 - 僅填充課程對象,返回Location ID,然後使用LocationRepository類查找位置詳細信息

我更傾向於B,因爲這是責任的分離,但是,讓我感到的是性能。假設我需要一個List而不是返回50的結果。查詢SQL 50次以查找位置詳細信息是否明智?希望你對此感興趣。

劉易斯

+0

從現實世界的看法,我會考慮一個'Course'用' Location'是一個'Session'。如果你記住,你可能需要重新安排你的課程的一個(或多個)實例到不同的位置,這應該會影響你的設計。 – Filburt

回答

0

部分地,你在思考錯誤的概念方向。它應該是:一個地點可以有很多課程,而不是相互的。

這就是說,理論上講,一個課程域對象不應該包含一個位置作爲類成員,而只是一個位置ID。另一方面,如果需要,域對象Location可以包含一個Course對象數組作爲類成員。你看到區別?

現在,在你的情況下,確實將一個Location作爲參數傳遞給一個Course對象。並且,在課程存儲庫中,定義一個像fetchCoursesWithLocations()這樣的方法,其中只運行一個sql查詢以獲取50個課程,並根據您的標準將相應的位置詳細信息放入數組中。然後遍歷記錄數組。對於每個記錄項目構建一個Location對象和一個Course對象(將Location對象作爲參數傳遞給它)。然後將每個如此創建的課程對象傳遞給另一個包含所有產生的課程對象的數組,或傳遞給一個CourseCollection對象(我​​推薦)。最後從方法返回Courses數組(或CourseCollection內容)。

現在,所有這些都太複雜了,無法呈現在這裏。但我會在這裏給你三篇很棒的文章(一個系列),這將使整個過程非常清晰。你會在那裏發現CourseCollection也應該看到。在文章中(從第二個開始),它使用術語「映射器」,我很確定它與「存儲庫」是一樣的。實際上,在db:mappers和repositories中有兩個數據訪問抽象層。加適配器。

看看部分PostMapperCommentMapper。它們分別與您的CourseRepository相似,分別爲您的LocationRepository。相同的角色有PostComment模型(域對象!):與CourseLocation相似。

的條款是:

  1. Building a Domain Model - An Introduction to Persistence Agnosticism
  2. Building a Domain Model - Integrating Data Mappers
  3. Handling Collections of Aggregate Roots - the Repository Pattern