{"id":368,"date":"2015-01-27T11:07:20","date_gmt":"2015-01-27T11:07:20","guid":{"rendered":"http:\/\/adriangrigoras.com\/blog\/?p=368"},"modified":"2015-01-27T11:07:20","modified_gmt":"2015-01-27T11:07:20","slug":"design-checklist","status":"publish","type":"post","link":"https:\/\/adriangrigoras.com\/blog\/design-checklist\/","title":{"rendered":"Design checklist"},"content":{"rendered":"<h3>Design Considerations<\/h3>\n<ul>\n<li>Areas of concern are separated.<\/li>\n<li>Every component has a single responsibility.<\/li>\n<li>Components do not rely on the internal details of other components.<\/li>\n<li>Functionality is not duplicated within the application.<\/li>\n<li>Components are grouped logically into layers.<\/li>\n<li>Abstraction is used to design loose coupling between layers.<\/li>\n<\/ul>\n<h3>Authentication<\/h3>\n<ul>\n<li>Trust boundaries have been identified, and users are authenticated across trust boundaries.<\/li>\n<li>Single sign-on is used when there are multiple systems in the application.<\/li>\n<li>Passwords are stored as a salted hash, not plain text.<\/li>\n<li>Strong passwords or password phrases are enforced.<\/li>\n<li>Passwords are not transmitted in plain text.<\/li>\n<\/ul>\n<h3>Authorization<\/h3>\n<ul>\n<li>Trust boundaries have been identified, and users are authorized across trust boundaries.<\/li>\n<li>Resources are protected with authorization on identity, group, claims or role.<\/li>\n<li>Role-based authorization is used for business decisions.<\/li>\n<li>Resource-based authorization is used for system auditing.<\/li>\n<li>Claims-based authorization is used for federated authorization based on a mixture of information such as identity, role, permissions, rights, and other factors.<\/li>\n<\/ul>\n<h3>Caching<\/h3>\n<ul>\n<li>Volatile data is not cached.<\/li>\n<li>Data is cached in ready to use format.<\/li>\n<li>Unencrypted sensitive data is not cached.<\/li>\n<li>Transactional resource manager or distributed caching is used, if your application is deployed in Web farm.<\/li>\n<li>Your application does not depend on data still being in cache.<\/li>\n<\/ul>\n<h3>Communication<\/h3>\n<ul>\n<li>Interfaces support chunky communication to reduce calls.<\/li>\n<li>Unmanaged code is used for communication across AppDomain boundaries.<\/li>\n<li>Message-based communication is used when crossing process or physical boundaries.<\/li>\n<li>Processing threads use asynchronous communication.<\/li>\n<li>Message queuing is used for reliable messaging.<\/li>\n<\/ul>\n<h3>Composition<\/h3>\n<ul>\n<li>Dynamic layouts are not used, if they need to be used maintenance tradeoff are considered.<\/li>\n<li>Abstraction is used between components to improve maintainability.<\/li>\n<li>Template View pattern is used, to improve reuse and consistency of dynamic web pages.<\/li>\n<li>Composite View pattern is used to compose views from modular atomic parts.<\/li>\n<\/ul>\n<h3>Concurrency and Transactions<\/h3>\n<ul>\n<li>Business-critical operations are wrapped in transactions.<\/li>\n<li>Connection-based transactions are used in the case of a single data source.<\/li>\n<li>Transaction Scope (System.Transaction) is used in the case of multiple data sources.<\/li>\n<li>Compensating methods are used to revert the data store to its previous state when transactions are not used.<\/li>\n<li>Locks are not held for long periods during long-running atomic transactions.<\/li>\n<\/ul>\n<h3>Configuration Management<\/h3>\n<ul>\n<li>Least-privileged process and service accounts are used.<\/li>\n<li>All the configurable application information is identified.<\/li>\n<li>Sensitive information in the configuration is encrypted.<\/li>\n<li>Access to configuration information is restricted.<\/li>\n<li>If there is a configuration UI, it is provided as a separate administrative UI.<\/li>\n<\/ul>\n<h3>Coupling and Cohesion<\/h3>\n<ul>\n<li>Application is partitioned into logical layers.<\/li>\n<li>Layers use abstraction through interface components, common interface definitions, or shared abstraction to provide loose coupling between layers..<\/li>\n<li>The components inside layers are designed for tight coupling, unless dynamic behavior requires loose coupling.<\/li>\n<li>Each component only contains functionality specifically related to that component.<\/li>\n<li>The tradeoffs of abstraction and loose coupling are well understood for your design. For instance, it adds overhead but it simplifies the build process and improves maintainability.<\/li>\n<\/ul>\n<h3>Data Access<\/h3>\n<ul>\n<li>Database schema is not coupled to your application model.<\/li>\n<li>Connections are opened as late as possible and released quickly.<\/li>\n<li>Data integrity is enforced in the database, not in the data access layer.<\/li>\n<li>Business decisions are made in the business layer, not the data access layer.<\/li>\n<li>Database is not directly accessed; database access is routed through the data access layer.<\/li>\n<li>Resource gateways are used to access resources outside the application.<\/li>\n<\/ul>\n<h3>Exception Management<\/h3>\n<ul>\n<li>Exceptions are only caught where they can be handled.<\/li>\n<li>Sensitive information is not included in exception messages or log files.<\/li>\n<li>There is a design for exception propagation.<\/li>\n<li>There is a strategy for handing unhandled exceptions.<\/li>\n<li>There is a strategy for logging exception information.<\/li>\n<li>Users are notified when there are critical errors and exceptions.<\/li>\n<\/ul>\n<h3>Layering<\/h3>\n<ul>\n<li>Layers represent a logical grouping of components. For example, use separate layers for user interface, business logic, and data access components.<\/li>\n<li>Components within each layer are cohesive. For example, the business layer components should provide only operations related to application business logic.<\/li>\n<li>When communication between layers crosses a physical tier, message-based operations are used.<\/li>\n<li>When communication does not cross a physical boundary, object-based operations are used.<\/li>\n<li>If testability is important, an Interface type has been defined for the interfaces in each layer.<\/li>\n<\/ul>\n<h3>Logging and Instrumentation<\/h3>\n<ul>\n<li>There is a centralize logging and instrumentation mechanism.<\/li>\n<li>System events and critical business events are instrumented.<\/li>\n<li>The design includes a strategy for passing audit and log information across tiers.<\/li>\n<li>Log files are secured against unauthorized access.<\/li>\n<li>Sensitive information is not stored in log files.<\/li>\n<\/ul>\n<h3>State Management<\/h3>\n<ul>\n<li>The only data persisted is what\u2019s necessary to maintain state.<\/li>\n<li>State is serialized if it needs to be persisted or shared across the network.<\/li>\n<li>Basic types are used for session data to reduce the serialization cost.<\/li>\n<li>Session state communication channel is protected.<\/li>\n<li>SQL Server state store is used, if reliability is the primary concern.<\/li>\n<\/ul>\n<h3>Structure<\/h3>\n<ul>\n<li>Your design is based on a common application structure such as Client\/Server or N-Tier.<\/li>\n<li>Deployment environment security requirements are well understood. For example, many security policies require physical separation of presentation logic from business logic across different sub-nets.<\/li>\n<li>Scalability and reliability requirements are well understood for your application.<\/li>\n<li>Deployment scenarios are well understood for your application.<\/li>\n<\/ul>\n<h3>User Experience<\/h3>\n<ul>\n<li>The design includes a consistent navigation experience. For example, composite patterns for the look-and-feel, and controller patterns such as MVC, Supervising Controller, and Passive View, for UI processing.<\/li>\n<li>Each page or section is focused on a specific task.<\/li>\n<li>Similar UI components have consistent behavior across the application. For example, a grid used to display data should be displayed and used consistently throughout the application.<\/li>\n<li>UI screens are not overloaded.<\/li>\n<\/ul>\n<h3>Validation<\/h3>\n<ul>\n<li>Trust boundaries are identified, and all the inputs are validated when they cross the trust boundary.<\/li>\n<li>A centralized validation approach is used.<\/li>\n<li>Validation strategy constrains, rejects, and sanitizes malicious input.<\/li>\n<li>Input data is validated for length, format, and type.<\/li>\n<li>Client-side validation is used for user experience and server-side validation is used for security.<\/li>\n<\/ul>\n<h3>Workflow<\/h3>\n<ul>\n<li>Workflow management requirements are well understood.<\/li>\n<li>There is a strategy for handling workflow exceptions.<\/li>\n<li>Service interfaces are used to interact with external workflow providers.<\/li>\n<li>Designers and metadata are used, where possible, to define workflow.<\/li>\n<\/ul>\n<p>Source:\u00a0apparch.codeplex.com<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Design Considerations Areas of concern are separated. Every component has a single responsibility. Components do not rely on the internal details of other components. Functionality is not duplicated within the application. Components are grouped logically into layers. Abstraction is used to design loose coupling between layers. Authentication Trust boundaries have been identified, and users are\u2026 <span class=\"read-more\"><a href=\"https:\/\/adriangrigoras.com\/blog\/design-checklist\/\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[30],"tags":[],"class_list":["post-368","post","type-post","status-publish","format-standard","hentry","category-architecture"],"_links":{"self":[{"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/posts\/368","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/comments?post=368"}],"version-history":[{"count":1,"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/posts\/368\/revisions"}],"predecessor-version":[{"id":369,"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/posts\/368\/revisions\/369"}],"wp:attachment":[{"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/media?parent=368"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/categories?post=368"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/tags?post=368"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}