09. Architecture Decisions

ADR-001: Three-Component Pipeline Structure

Status

Accepted

Context

The system needs to read, process, and output minesweeper fields. A clear decomposition strategy is needed.

Decision

Split the application into three components: Input Parser, Field Processor, and Output Formatter, orchestrated by main().

Rationale

Each component has a single responsibility. The pipeline structure makes data flow explicit and each stage independently testable.

Consequences

  • (+) Clean separation of concerns.

  • (+) Each component can be tested in isolation.

  • (-) Slight overhead of passing data structures between stages, negligible at this scale.


ADR-002: vector<string> as Grid Representation

Status

Accepted

Context

The field grid needs an in-memory representation that supports row/column indexing for neighbour lookups.

Decision

Represent each field’s grid as a vector<string>, where each string is one row.

Rationale

Simple, idiomatic C++. Character access via grid[r][c] is direct. No custom data structure needed for this problem size.

Consequences

  • (+) Minimal code, easy to read and manipulate.

  • (-) Mutates the grid in-place during processing; a copy would be needed if the original must be preserved (not required here).


ADR-003: Synchronous Single-Threaded Execution

Status

Accepted

Context

Multiple fields must be processed sequentially.

Decision

Process all fields in a single thread, sequentially.

Rationale

The problem size is small and bounded. Concurrency would add complexity with no benefit.

Consequences

  • (+) Simple, deterministic execution.

  • (-) Not scalable to very large inputs, which is outside the kata scope.