> For the complete documentation index, see [llms.txt](https://dev.ppgg.in/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dev.ppgg.in/architecture/adr.md).

# 架构决策记录 (ADR)

{% hint style="info" %}
对应的[官方页面地址](https://contributing.bitwarden.com/architecture/adr/)
{% endhint %}

> 架构决策记录：Architectural Decision Records，简称 ADR。

[架构决策 (AD)](https://en.wikipedia.org/wiki/Architectural_decision) 是一种软件设计选择，用于解决在架构上具有重要意义的功能性或非功能性需求。例如，对于实例，这可能是技术选择（例如 Java 与 JavaScript）、IDE 的选择（例如 IntelliJ 与 Eclipse IDE）、库之间的选择（例如 [SLF4J](https://www.slf4j.org/) 与 [java.util.logging](https://docs.oracle.com/javase/8/docs/api/java/util/logging/package-summary.html)），或功能上的决策（例如，无限撤消与有限撤消）。

## @Bitwarden

在 Bitwarden 的工程团队中引入架构决策 (AD) 的目的是引导开发朝着可维护和可扩展的代码库方向发展。同时努力确保所有团队的一致性。

AD 还将作为提议和规划技术债务的基础。

### 状态定义 <a href="#status-definition" id="status-definition"></a>

* **进行中** - ADR 已获批准，我们正在整个项目中采用它。
* **标准** - ADR 已实施并假定为标准。
* **已放弃** - ADR 已被放弃，和/或被另一个 ADR 取代。

### 标签 <a href="#tags" id="tags"></a>

请确保每个 ADR 都包含一个标签，标记它们适用于哪些项目（*客户端*、*移动端*和/或*服务器*）。如果需要，请随意创建更多标签。

## 流程 <a href="#process" id="process"></a>

虽然流程最初主要是为发起者讨论架构决策而创建的，但对我们来说保持流程对任何人的建议开放是很重要的。为此，任何人都可以自由地打开 PR 来建议 AD。然后将讨论这些建议，以便在采纳之前在发起者之间达成普遍共识。

## ADR <a href="#adrs" id="adrs"></a>

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>0001 - Angular Reactive Forms</td><td><a href="/pages/CdrEfaxUzlN1ULejuCEO">/pages/CdrEfaxUzlN1ULejuCEO</a></td></tr><tr><td>0002 - Public API for modules</td><td><a href="/pages/fRixFKGMgN5KdHNSkY97">/pages/fRixFKGMgN5KdHNSkY97</a></td></tr><tr><td>0003 - Adopt Observable Data Services for Angular</td><td><a href="/pages/qfn2TE4r6GQc2IrypuC6">/pages/qfn2TE4r6GQc2IrypuC6</a></td></tr><tr><td>0004 - Refactor State Service</td><td><a href="/pages/XHcRhzUHXxSA7KVhrQEX">/pages/XHcRhzUHXxSA7KVhrQEX</a></td></tr><tr><td>0005 - Refactor Api Service</td><td><a href="/pages/E4Gt3niMCNXFDAPPZTAs">/pages/E4Gt3niMCNXFDAPPZTAs</a></td></tr><tr><td>0006 - Clients: Use Jest Mocks</td><td><a href="/pages/aOhqXBvw1Lm2nYSXr0MT">/pages/aOhqXBvw1Lm2nYSXr0MT</a></td></tr><tr><td>0007 - Manifest V3 sync Observables</td><td><a href="/pages/2elDdKbGQRlDKGXI5Y5s">/pages/2elDdKbGQRlDKGXI5Y5s</a></td></tr><tr><td>0008 - Server: Adopt CQRS</td><td><a href="/pages/eDK3SCtNQgkNrSHwNFov">/pages/eDK3SCtNQgkNrSHwNFov</a></td></tr><tr><td>0009 - Composition over inheritance</td><td><a href="/pages/SqEv5519euJ6PY9zgUq9">/pages/SqEv5519euJ6PY9zgUq9</a></td></tr><tr><td>0010 - Angular Modules</td><td><a href="/pages/eSaCaWrYeualjpa8btRH">/pages/eSaCaWrYeualjpa8btRH</a></td></tr><tr><td>0011 - Angular Clients folder structure</td><td><a href="/pages/3kc1BW3XGWad149gk7Cj">/pages/3kc1BW3XGWad149gk7Cj</a></td></tr><tr><td>0012 - Angular Filename convention</td><td><a href="/pages/vkYaHQSDEiUeveRdQUe3">/pages/vkYaHQSDEiUeveRdQUe3</a></td></tr><tr><td>0013 - Avoid layered folder structure</td><td><a href="/pages/y1AbjH7oEaxAHvQm1eyl">/pages/y1AbjH7oEaxAHvQm1eyl</a></td></tr><tr><td>0014 - Adopt Typescript Strict flag</td><td><a href="/pages/D7IoHtuD2Ob1zNp5VTa9">/pages/D7IoHtuD2Ob1zNp5VTa9</a></td></tr><tr><td>0015 - Short Lived Browser Services</td><td><a href="/pages/YwaQCWudc87xQExIogcZ">/pages/YwaQCWudc87xQExIogcZ</a></td></tr><tr><td>0016 - Move Decryption and Encryption to Views</td><td><a href="/pages/V2P4K07QxZ4FHxA19hWe">/pages/V2P4K07QxZ4FHxA19hWe</a></td></tr><tr><td>0017 - Use Swift to build watchOS app</td><td><a href="/pages/LkcdeFCpXa7D0lec4h6j">/pages/LkcdeFCpXa7D0lec4h6j</a></td></tr><tr><td>0018 - Feature management</td><td><a href="/pages/Mav7TqfQbZWvlGAFRVBK">/pages/Mav7TqfQbZWvlGAFRVBK</a></td></tr><tr><td>0019 - Adoption of Web Push</td><td><a href="/pages/63zO9V0qUV9SHLisxmkd">/pages/63zO9V0qUV9SHLisxmkd</a></td></tr><tr><td>0020 - Observability with OpenTelemetry</td><td><a href="/pages/ceccgiHSHU10egflR3xo">/pages/ceccgiHSHU10egflR3xo</a></td></tr><tr><td>0021 - Logging to Standard Output</td><td><a href="/pages/joTT0g9UoncKXQzKib7T">/pages/joTT0g9UoncKXQzKib7T</a></td></tr></tbody></table>
