From 58b5092a59acbe4350b9ab12ece7dcc587f390c9 Mon Sep 17 00:00:00 2001 From: Mark Date: Tue, 2 Jul 2024 12:30:01 -0500 Subject: [PATCH 1/3] feat: add architecture topic --- astro.config.mjs | 6 + src/content/docs/architecture/architecture.md | 173 ++++++++++++++++++ src/public/very_good_architecture.png | Bin 0 -> 99975 bytes 3 files changed, 179 insertions(+) create mode 100644 src/content/docs/architecture/architecture.md create mode 100644 src/public/very_good_architecture.png diff --git a/astro.config.mjs b/astro.config.mjs index 7808941..9d29ab6 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -68,6 +68,12 @@ export default defineConfig({ directory: "reference", }, }, + { + label: "Architecture", + autogenerate: { + directory: "architecture", + }, + }, { label: "Testing", autogenerate: { diff --git a/src/content/docs/architecture/architecture.md b/src/content/docs/architecture/architecture.md new file mode 100644 index 0000000..cf72724 --- /dev/null +++ b/src/content/docs/architecture/architecture.md @@ -0,0 +1,173 @@ +--- +title: Architecture +description: Architecture best practices. +--- + +Layered architecure is used at VGV to build highly scalable, maintainable, and testable apps. The architecture consists of four layers: the data layer, the domain layer, the business logic layer, and the presentation layer. Each layer has a single responsibility and there are clear boundaries between each one. + +## Layers + +### Data layer + +This is the lowest layer. It is responsible for retrieving raw data from external sources, like an SQLite database, local storage, Shared Preferences, GPS, battery, or from a RESTful API, and exposing it to the domain layer. The data layer should be free of any specific domain or business logic. Ideally, packages in this layer could be published to pub.dev and plugged in and used in other unrelated projects. + +> This layer can be considered the "engineering" layer because it focuses on how to process and transform data in a performant way. + +### Domain layer + +This compositional layer composes one or more data clients and applies "business rules" to the data. This layer can also be called the "repository" layer because each component in this layer is a repository, and one repository is created for each domain (e.g. user_repository, weather_repository, etc.). Packages in this repository layer should not depend on other repositories. + +> This layer can be considered the "product" layer. The business/product owner will determine the rules/acceptance criteria for how to combine data from one or more data providers into a unit that brings value to the customer. + +### Business logic layer + +This layer composes one or more repositories and contains logic for how to surface the business rules via a specific feature or use-case. This is the layer that implements the bloc library, which will retrieve data from the repository layer and update the app's state. The business logic layer should have no dependency on the Flutter SDK and should not have direct dependencies on other business logic components. + +> This layer can be considered the "feature" layer. Design and product will determine the rules for how a particular feature will function. + +### Presentation layer + +This is the UI layer of the app where we use Flutter to "paint pixels" on the screen. No business logic should exist in this layer. The presentation layer should only interact with the business logic layer. + +> This layer can be considered the "design" layer. Designers will determine the user interface in order to provide the best possible experience for the customer. + +## Project organization + +The presentation layer and state management live in the project's `lib` folder. The data and domain layers will live as separate packages within the project's `packages` folder. + +Good ✅ + +``` +my_app/ + |- lib/ + | |- login/ + | | |- bloc/ + | | | - login_bloc.dart + | | | - login_event.dart + | | | - login_state.dart + | | |- view/ + | | | - login_page.dart + | | | - view.dart + |- packages/ + | |- user_repository/ + | | |- lib/ + | | | |- src/ + | | | | |- models/ + | | | | | - models.dart + | | | | | - user.dart + | | | | |- user_repository.dart + | | | - user_repository.dart + | | |- test/ + | | | |- models/ + | | | | - user_test.dart + | | | - user_repository_test.dart + | |- api_client/ + | | |- lib/ + | | | |- src/ + | | | | - api_client.dart + | | | - api_client.dart + | | |- test/ + | | | - api_client_test.dart + |- test/ + | |- login/ + | | |- bloc/ + | | | - login_bloc_test.dart + | | | - login_event_test.dart + | | | - login_state_test.dart + | | |- view/ + | | | - login_page_test.test +``` + +Each layer abstracts the underlying layers' implementation details. It is important to not have indirect dependencies between layers. For example, the domain layer shouldn't need to know how the data is fetched in the data layer, and the presentation layer shouldn't directly access values from Shared Preferences. In other words, the implementation details should not leak between the layers. Using layered architecture ensures flexibility, reusability, and testability as the codebase grows. + +## Dependency graph + +![Layered Architecture](../../../public/very_good_architecture.png) + +When using layered architecture, data should only flow from the bottom up, and a layer can only access the layer directly beneath it. For example, the `LoginPage` should never directly access the `ApiClient`, or the `ApiClient` should not be dependent on the `UserRepository`. With this approach, each layer has a specific responsibility and can be tested in isolation. + +Good ✅ + +```dart +class LoginPage extends StatelessWidget { + ... + LoginButton( + onPressed: => context.read().add(const LoginSubmitted()); + ) + ... +} + +class LoginBloc extends Bloc { + ... + Future _onLoginSubmitted( + LoginSubmitted event, + Emitter emit, + ) async { + try { + await _userRepository.logIn(state.email, state.password); + emit(const LoginSuccess()); + } catch (error, stackTrace) { + addError(error, stackTrace); + emit(const LoginFailure()); + } + } +} + +class UserRepository { + const UserRepository(this.apiClient); + + final ApiClient apiClient; + + final String loginUrl = '/login'; + + Future logIn(String email, String password) { + await apiClient.makeRequest( + url: loginUrl, + data: { + 'email': email, + 'password': password, + }, + ); + } +} +``` + +Bad ❗️ + +```dart +class LoginPage extends StatelessWidget { + ... + LoginButton( + onPressed: => context.read().add(const LoginSubmitted()); + ) + ... +} + +class LoginBloc extends Bloc { + ... + + final String loginUrl = '/login'; + + Future _onLoginSubmitted( + LoginSubmitted event, + Emitter emit, + ) async { + try { + await apiClient.makeRequest( + url: loginUrl, + data: { + 'email': state.email, + 'password': state.password, + }, + ); + + emit(const LoginSuccess()); + } catch (error, stackTrace) { + addError(error, stackTrace); + emit(const LoginFailure()); + } + } +} +``` + +In this example, the API implementation details are now leaked and made known to the bloc. The API's login url and request information should only be known to the `UserRepository`. Also, the `ApiClient` instance will have to be provided directly to the bloc. If the `ApiClient` ever changes, every bloc that relies on the `ApiClient` will need to be updated and retested. diff --git a/src/public/very_good_architecture.png b/src/public/very_good_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..31aaf9942c3d9c1187c2cfa4a77af16f8624c3ba GIT binary patch literal 99975 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 Date: Wed, 3 Jul 2024 15:54:51 -0500 Subject: [PATCH 2/3] docs: add responsibilities for each layer --- src/content/docs/architecture/architecture.md | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/content/docs/architecture/architecture.md b/src/content/docs/architecture/architecture.md index cf72724..94c13c7 100644 --- a/src/content/docs/architecture/architecture.md +++ b/src/content/docs/architecture/architecture.md @@ -3,31 +3,45 @@ title: Architecture description: Architecture best practices. --- -Layered architecure is used at VGV to build highly scalable, maintainable, and testable apps. The architecture consists of four layers: the data layer, the domain layer, the business logic layer, and the presentation layer. Each layer has a single responsibility and there are clear boundaries between each one. +Layered architecture is used at VGV to build highly scalable, maintainable, and testable apps. The architecture consists of four layers: the data layer, the domain layer, the business logic layer, and the presentation layer. Each layer has a single responsibility and there are clear boundaries between each one. We've discovered that a layered architecture significantly enhances the developer experience. Each layer can be developed independently by different teams without impacting other layers. Testing is simplified since only one layer needs to be mocked. Additionally, a structured approach clarifies component ownership, streamlining development and code reviews. ## Layers ### Data layer -This is the lowest layer. It is responsible for retrieving raw data from external sources, like an SQLite database, local storage, Shared Preferences, GPS, battery, or from a RESTful API, and exposing it to the domain layer. The data layer should be free of any specific domain or business logic. Ideally, packages in this layer could be published to pub.dev and plugged in and used in other unrelated projects. +This is the lowest layer of the stack. It is the layer that is closest to the retrieval of data, hence the name. The data layer should be free of any specific domain or business logic. Ideally, packages within the data layer could be plugged into unreleated projects that need to retrieve data from the same sources. -> This layer can be considered the "engineering" layer because it focuses on how to process and transform data in a performant way. +#### Responsibility + +The data layer is responsible for retrieving raw data from external sources and making it available to the domain layer. Examples of these external sources include a SQLite database, local storage, Shared Preferences, GPS, battery data, file system, or a RESTful API. ### Domain layer -This compositional layer composes one or more data clients and applies "business rules" to the data. This layer can also be called the "repository" layer because each component in this layer is a repository, and one repository is created for each domain (e.g. user_repository, weather_repository, etc.). Packages in this repository layer should not depend on other repositories. +This compositional layer composes one or more data clients and applies "business rules" to the data. This layer is also known as the "repository" layer because each component in this layer acts as a repository. A separate repository is created for each domain, such as a user repository or a weather repository. Packages in this layer should not import any Flutter dependencies and not be dependent on other repositories. + +#### Responsibility + +The domain layer is responsible for fetching data from one or more data sources from the data layer, applying domain specific logic to that raw data, and providing it to the business logic layer. > This layer can be considered the "product" layer. The business/product owner will determine the rules/acceptance criteria for how to combine data from one or more data providers into a unit that brings value to the customer. ### Business logic layer -This layer composes one or more repositories and contains logic for how to surface the business rules via a specific feature or use-case. This is the layer that implements the bloc library, which will retrieve data from the repository layer and update the app's state. The business logic layer should have no dependency on the Flutter SDK and should not have direct dependencies on other business logic components. +This layer composes one or more repositories and contains logic for how to surface the business rules via a specific feature or use-case. The business logic layer should have no dependency on the Flutter SDK and should not have direct dependencies on other business logic components. + +#### Responsibility + +The business logic layer is the layer that implements the bloc library, which will retrieve data from the repository layer and provide a new state to the presentation layer. > This layer can be considered the "feature" layer. Design and product will determine the rules for how a particular feature will function. ### Presentation layer -This is the UI layer of the app where we use Flutter to "paint pixels" on the screen. No business logic should exist in this layer. The presentation layer should only interact with the business logic layer. +The presentation layer is the top layer in stack. It is the UI layer of the app where we use Flutter to "paint pixels" on the screen. No business logic should exist in this layer. The presentation layer should only interact with the business logic layer. + +#### Responsibility + +The presentation layer is the layer that includes the Flutter UI dependencies. It is responsible for building widgets and managing the widget's lifecycle. This layer requests updates from the business logic layer to provide it with a new state to update the widget with the correct data. > This layer can be considered the "design" layer. Designers will determine the user interface in order to provide the best possible experience for the customer. @@ -78,7 +92,7 @@ my_app/ | | | - login_page_test.test ``` -Each layer abstracts the underlying layers' implementation details. It is important to not have indirect dependencies between layers. For example, the domain layer shouldn't need to know how the data is fetched in the data layer, and the presentation layer shouldn't directly access values from Shared Preferences. In other words, the implementation details should not leak between the layers. Using layered architecture ensures flexibility, reusability, and testability as the codebase grows. +Each layer abstracts the underlying layers' implementation details. Avoid indirect dependencies between layers. For example, the domain layer shouldn't need to know how the data is fetched in the data layer, and the presentation layer shouldn't directly access values from Shared Preferences. In other words, the implementation details should not leak between the layers. Using layered architecture ensures flexibility, reusability, and testability as the codebase grows. ## Dependency graph From 6f19ed0beddba5f192e89a780827a8e647429871 Mon Sep 17 00:00:00 2001 From: Mark Date: Tue, 9 Jul 2024 13:03:33 -0500 Subject: [PATCH 3/3] docs: update data layer --- src/content/docs/architecture/architecture.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/content/docs/architecture/architecture.md b/src/content/docs/architecture/architecture.md index 94c13c7..391ad6e 100644 --- a/src/content/docs/architecture/architecture.md +++ b/src/content/docs/architecture/architecture.md @@ -9,11 +9,13 @@ Layered architecture is used at VGV to build highly scalable, maintainable, and ### Data layer -This is the lowest layer of the stack. It is the layer that is closest to the retrieval of data, hence the name. The data layer should be free of any specific domain or business logic. Ideally, packages within the data layer could be plugged into unreleated projects that need to retrieve data from the same sources. +This is the lowest layer of the stack. It is the layer that is closest to the retrieval of data, hence the name. #### Responsibility -The data layer is responsible for retrieving raw data from external sources and making it available to the domain layer. Examples of these external sources include a SQLite database, local storage, Shared Preferences, GPS, battery data, file system, or a RESTful API. +The data layer is responsible for retrieving raw data from external sources and making it available to the [domain layer](#domain-layer). Examples of these external sources include an SQLite database, local storage, Shared Preferences, GPS, battery data, file system, or a RESTful API. + +The data layer should be free of any specific domain or business logic. Ideally, packages within the data layer could be plugged into unreleated projects that need to retrieve data from the same sources. ### Domain layer