Skip to content

Commit fa206d5

Browse files
committed
reviews
1 parent f457428 commit fa206d5

58 files changed

Lines changed: 3873 additions & 8063 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
File renamed without changes.

README-CODE-REVIEW-BREWSTER.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
## Detailed Review Findings
2+
3+
**1. Data Registry**
4+
5+
* **Finding:** `Brewster.cs` successfully implements the core data registry requirement. It uses two distinct `Dictionary<string, T>` instances (`_collections` and `_items`) to store loaded `Collection` and `Item` objects, respectively, keyed by their string identifiers. This structure provides efficient lookup via the `GetCollection` and `GetItem` methods.
6+
7+
**2. Single Source of Truth (Runtime)**
8+
9+
* **Finding:** `Brewster.cs` acts as the designated **Single Source of Truth for runtime data state**. It systematically loads all collection and item data directly from JSON files within the `StreamingAssets` folder upon startup, using a well-defined, multi-phase process managed by coroutines and a centralized JSON loading helper (`LoadJson`). The loaded data is stored internally and accessed exclusively through public accessor methods (`GetCollection`, `GetItem`) on the `Brewster` singleton instance. The `OnAllContentLoaded` event provides a clear signal for dependent systems.
10+
11+
**3. Identifier Usage**
12+
13+
* **Finding:** The implementation strongly adheres to the **identifier usage principle**. The relationship between a `Collection` and its `Items` is managed explicitly via a `List<string> ItemIds` property on the `Collection` object itself, populated from `items-index.json`. `Brewster` avoids storing direct object references for relationships internally. This design directly supports the "JSON-first" philosophy, ensuring compatibility with the data pipeline and runtime constraints. Retrieving items for a collection requires using the ID list from the `Collection` object and looking up each item via `Brewster.GetItem(id)`.
14+
15+
**4. Caching**
16+
17+
* **Finding:** The primary data registries (`_collections`, `_items`) act as an application-lifetime cache of models loaded from `StreamingAssets` at startup, with no runtime invalidation based on file changes. An explicit, separate, demand-driven cache (`_textureCache`) exists for `Texture2D` objects, keyed by path, also without runtime invalidation. Cache coherency relies on static content within `StreamingAssets` during execution.
18+
19+
**5. Interaction with Generated Code**
20+
21+
* **Finding:** `Brewster` interacts correctly with the generated code (`Collection`, `Item`, likely inheriting from `SchemaGeneratedObject`). It fetches JSON data as `JToken`s and delegates deserialization/population to an `ImportFromJToken` method assumed to exist on the `Collection`/`Item` classes (likely via `SchemaGeneratedObject`). `Brewster` does not directly handle deserialization details or access `extraFields`, focusing on orchestration and registry management. It uses `ScriptableObject.CreateInstance`, indicating models derive from `ScriptableObject`.
22+
23+
**6. Support for Downstream Systems**
24+
25+
* **Finding:** `Brewster` effectively supports downstream systems via simple ID-based accessors (`GetCollection`, `GetItem`). Data models are loaded **upfront**, signaled by `OnAllContentLoaded`, simplifying consumer logic. Textures are loaded **on demand and asynchronously** with callbacks (`LoadTexture`). This facilitates MVR by providing a central Model source and clear readiness signal, while handling visual loading asynchronously.
26+
27+
**7. Adherence to SSOT**
28+
29+
* **Finding:** `Brewster`'s internal state is **fundamentally driven by the content loaded from `StreamingAssets`** (the runtime SSOT). The loading process reads the expected index and data files. By delegating JSON parsing/mapping to the `Collection`/`Item` classes (`ImportFromJToken`), it inherently **respects the structures defined by the generated schema classes** as interpreted by those methods, acting as a faithful loader and registry.
30+
31+
**8. Consumer Interaction: Core Systems (`CollectionDisplay`, `ViewFactory`)**
32+
33+
* **Finding:** Core systems show separation of concerns. Coordinators (`CollectionDisplay`) query `Brewster` using IDs (`GetCollection`) to retrieve models. `ViewFactory` acts purely as an instantiator, receiving already-loaded models; it does not query `Brewster`. The pattern suggests `CollectionView` uses `Brewster` (`GetItem`) and `ViewFactory` (`CreateItemView`) together to populate its item visuals based on the `Collection.ItemIds` list.
34+
35+
**9. View Layer (`CollectionView`, `ItemView`, `ItemViewsContainer`, Interfaces)**
36+
37+
* **Finding:** The View layer uses `IModelView<T>` for data binding via `SetModel`. Views register with Models to receive updates (`HandleModelUpdated`), suggesting an observer pattern likely rooted in `SchemaGeneratedObject`. Data binding involves direct model property access and initiating async loads (textures via `Brewster`). Prefab management is structured: `CollectionView` manages `ItemViewsContainer`s, which in turn manage `ItemView` instantiation.
38+
39+
**10. Renderer Layer (`BaseViewRenderer`, `SingleImageRenderer`)**
40+
41+
* **Finding:** The Renderer layer uses `BaseViewRenderer<T>` for common functionality (activation, transitions) and defines `UpdateWithModel(T model)` for data binding. Concrete renderers (`SingleImageRenderer`) manage their own visuals and implement `UpdateWithModel` to apply model data (e.g., loading textures via `Resources.Load`, adjusting mesh aspect ratios). Data flows from View (`ItemView`) to its Renderers via `UpdateWithModel`. The design supports composability. (Note: `SingleImageRenderer` uses `Resources.Load`, potentially inconsistent with `Brewster`'s texture loading/caching).
42+
43+
**11. Schema Plumbing: Base & Extension Classes (`SchemaGeneratedObject`, `Collection`, `Item`)**
44+
45+
* **Finding:** `SchemaGeneratedObject` provides robust, IL2CPP-compatible JSON handling by delegating known property mapping to generated code (`ImportKnownProperties`, etc.) while managing `extraFields`. It uses a custom view registration system, not `INotifyPropertyChanged`. Manual partial classes (`Collection.cs`, `Item.cs`) cleanly extend functionality: `Collection` adds `ItemIds` and a lazy-loading `Items` property; `Item` manages the runtime `cover` texture lifecycle.
46+
47+
**12. Editor Tooling (`SchemaGenerator`, `Build`)**
48+
49+
* **Finding:** Editor tooling provides essential automation. `SchemaGenerator.cs` generates IL2CPP-compatible C# classes from JSON schemas, explicitly handling known properties and integrating with `SchemaGeneratedObject`. It supports CI/CD execution. (Note: `x_meta` converter usage appears partial). `Build.cs` provides scriptable methods for automated Standalone and WebGL builds with dev/prod options and CI/CD exit codes.
50+
51+
*(Further review notes will be added below)*

0 commit comments

Comments
 (0)