0% found this document useful (0 votes)
15 views

Architecture-Model

Uploaded by

akyadav123
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
15 views

Architecture-Model

Uploaded by

akyadav123
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 14

Chapter - 3

Architecture-model:
 In software engineering, an "architecture model" refers to a conceptual framework or representation
that describes the structure, behavior, and interaction of the various components within a software
system.
 It provides a high-level view of the system's design, allowing developers and stakeholders to
understand, communicate, and document the key aspects of the software's architecture.

There are several widely recognized architecture models used in software engineering:

1. Layered Architecture:
 This model organizes the software into distinct layers, with each layer responsible for a specific
set of tasks or functionalities.
 Communication between layers typically occurs in a hierarchical manner, with each layer
providing services to the layer above it and consuming services from the layer below it.
 Common layers include Presentation (UI), Business Logic, and Data Access.

2. Client-Server Architecture:
 In this model, the software system is divided into two main components: a client (which requests
services) and a server (which provides services).
 The client and server communicate over a network, and this architecture is commonly used in
networked applications.

3. Model-View-Controller (MVC) Architecture:


 MVC separates the concerns of an application into three main components:
- Model: Represents the data and business logic of the application. It defines how data is
stored, retrieved, and manipulated.

- View: Represents the user interface or presentation layer. It is responsible for displaying the
data and receiving user input.

- Controller: Acts as an intermediary between the Model and View. It processes user input,
interacts with the Model to update data, and updates the View to reflect changes.

4. Microservices Architecture:
 This modern architecture model involves breaking down a large application into a collection of
small, independently deployable services.
 Each service is responsible for a specific business capability and can be developed, deployed,
and scaled independently.

5. Service-Oriented Architecture (SOA):


 SOA is an architectural style that structures software as a collection of loosely coupled services.
 These services communicate over a network using standard protocols.
 Each service provides a specific business functionality.

https://onlinecollegenotes.com
6. Component-Based Architecture:
 In this model, the software system is constructed from pre-built, reusable components. These
components can be independently developed and maintained, and they interact with each other to
achieve the desired functionality.

7. Event-Driven Architecture (EDA):


 EDA is an architectural style that emphasizes the production, detection, consumption, and
reaction to events. Components communicate asynchronously based on events, allowing for more
flexible and responsive systems.

Note: These architecture models serve as blueprints for designing software systems. The choice of
architecture model depends on various factors, including the nature of the application, scalability
requirements, development team capabilities, and business needs. Each model has its strengths and is
suitable for different types of applications and system requirements.

Phases of architecture model

1. Requirements Analysis:
 In this phase, the focus is on understanding and documenting what the software system needs to
accomplish.
 It involves gathering and analyzing requirements from stakeholders, which can include functional
features, performance expectations, usability criteria, and any other specifications that define the
system's behavior and constraints.
 Key Activities:
- Eliciting requirements from stakeholders through interviews, surveys, and workshops.
- Analyzing requirements to ensure they are clear, complete, and consistent.
- Prioritizing requirements based on their importance and impact on the system.

2. Design:
 The design phase builds upon the requirements analysis.
 It involves creating a high-level blueprint that outlines how the system will be structured.
 This includes defining the architectural components, their relationships, and the overall flow of
data and control.
 It serves as a guide for the actual implementation.
 Key Activities:
- Defining the system's architecture, including components, modules, and their interactions.
- Specifying interfaces and interactions between system components.
- Addressing non-functional aspects like performance, security, and scalability.

3. Implementation:
 This phase involves the actual development of the software based on the design specifications.
 It's where the code is written, tested, and integrated to form the complete system.
 Implementation translates the design into executable software.
 Key Activities:
- Writing code for individual modules or components.
- Conducting unit testing to verify the correctness of individual units of code.

https://onlinecollegenotes.com
- Integrating components and conducting integration testing to ensure they work together
seamlessly.

4. Test Model (Analysis):


 The test model phase focuses on establishing a framework for evaluating the software against its
specified requirements.
 It involves planning and designing various types of tests to verify that the system meets its
intended functionality and performance expectations.
 Key Activities:
- Planning and designing test cases for different levels of testing (e.g., unit testing, integration
testing, system testing).
- Setting up the testing environment and ensuring necessary resources are available for testing
activities.
- Establishing metrics and criteria for determining the success of testing.

5. Construction (Analysis):
 Construction, within the context of the test model phase, refers to executing the planned tests,
recording results, and identifying any discrepancies or issues found during testing.
 It's about actively running the tests and capturing the outcomes.
 Key Activities:
- Executing the planned test cases against the software system.
- Documenting the results of each test, including any failures or deviations from expected
outcomes.
- Identifying and logging defects or issues that arise during testing.

These phases collectively represent the process of creating a software architecture model, from
understanding requirements to designing, implementing, and testing the system. It's a structured
approach that ensures that the resulting software meets the specified needs and functions as intended.

Real-time-classification of real time systems

 Real-time systems are computer systems that are designed to respond to events or inputs within a
specified time frame. They are categorized based on their ability to meet timing constraints. Real-time
systems can be broadly classified into the following categories:

1. Hard Real-Time Systems:


 In hard real-time systems, meeting the specified deadlines is critical.
 Failure to respond within the defined time frame could lead to catastrophic consequences.
 These systems are commonly found in safety-critical applications, such as aviation control
systems, medical equipment, and nuclear reactors.

2. Firm Real-Time Systems:


 Firm real-time systems have strict timing requirements, but occasional missed deadlines are
tolerable.
 The usefulness of the system decreases if deadlines are frequently missed, but it may still function
with degraded performance.
 Examples include multimedia streaming applications.

https://onlinecollegenotes.com
3. Soft Real-Time Systems:
 Soft real-time systems have timing constraints that are more relaxed compared to hard and firm
real-time systems.
 These systems can tolerate occasional delays without significant impact.
 Examples include video conferencing applications or online gaming.

4. Event-Driven Systems:
 In event-driven real-time systems, tasks or processes are triggered by external events.
 These systems must respond to events in a timely manner.
 Examples include sensor networks and control systems.

5. Time-Sharing Systems:
 Time-sharing real-time systems allocate processing time to multiple tasks or processes.
 Each task is given a time slice to execute, and the system switches between tasks.
 This approach is common in operating systems for multitasking environments.

6. Embedded Real-Time Systems:


 Embedded real-time systems are specialized computing systems designed to perform dedicated
functions within a larger system or device.
 They are often found in applications such as automotive control systems, consumer electronics,
and industrial automation.

7. Control Systems:
 Control systems are a subset of real-time systems that regulate physical processes or machinery.
 They continuously monitor sensor inputs and adjust outputs to maintain desired conditions.
 Examples include HVAC systems, industrial automation, and robotics.

8. Distributed Real-Time Systems:


 Distributed real-time systems consist of multiple interconnected components or nodes that work
together to achieve a common goal.
 These systems are often used in applications where processing is distributed across multiple
devices or locations.

9. Multimedia Systems:
 Multimedia real-time systems handle the processing and delivery of multimedia content, such as
audio, video, and graphics.
 These systems require precise timing to ensure seamless playback and synchronization.

10. Automotive Control Systems:


 Automotive control systems in modern vehicles manage various functions, including engine
control, braking, airbag deployment, and entertainment systems.
 These systems require real-time processing to ensure safe and efficient vehicle operation.

Note: Understanding the classification of real-time systems is crucial for designing and implementing
systems that meet their specified timing requirements, which is essential for their successful operation in
various applications.

https://onlinecollegenotes.com
Database-RDBMS
 A Relational Database Management System (RDBMS) is a type of database management system
that is based on the relational model of data. It allows users to create, update, and manage relational
databases.

Here are some key characteristics and concepts associated with RDBMS:

1. Tables: In RDBMS, data is organized into tables. Each table consists of rows (also known as tuples)
and columns. Rows represent individual records or entries, while columns represent attributes or
fields of those records.

2. Relations: The term "relational" in RDBMS comes from the concept of relationships between tables.
These relationships are established using keys (such as primary keys and foreign keys) that link data
in one table to data in another.

3. Primary Key: A primary key is a unique identifier for a record in a table. It ensures that each record is
uniquely identifiable. This is a critical concept in maintaining data integrity.

4. Foreign Key: A foreign key is a field in one table that refers to the primary key in another table. It
establishes relationships between tables, allowing for data retrieval and integrity.

5. Normalization: Normalization is the process of organizing data in a database to minimize


redundancy and dependency. It involves breaking up large tables into smaller, more manageable
ones and establishing relationships between them.

6. ACID Properties: RDBMS systems ensure data consistency and reliability through ACID properties:
 Atomicity: Transactions are all or nothing. If one part of a transaction fails, the entire transaction
is rolled back.

 Consistency: Transactions take the database from one consistent state to another consistent
state.

 Isolation: Transactions do not interfere with each other. Each transaction operates independently.

 Durability: Once a transaction is committed, the changes are permanent and will not be lost.

7. Structured Query Language (SQL): RDBMS uses SQL as its query language. SQL allows users to
interact with the database by performing tasks like querying data, inserting, updating, and deleting
records, and managing the database schema.

8. Data Integrity: RDBMS systems enforce data integrity through constraints. This includes rules for the
type of data allowed in a column, uniqueness constraints, and referential integrity through foreign key
relationships.

9. Indexes: Indexes are data structures that improve the speed of data retrieval operations. They
provide a way to quickly locate rows in a table based on the values of specific columns.

10. Transactions: A transaction is a unit of work performed on a database. It is a sequence of operations


that are treated as a single unit. Transactions ensure data consistency and integrity.

https://onlinecollegenotes.com
11. Security: RDBMS systems have built-in security features that allow administrators to control access
to the database. This includes user authentication, authorization, and encryption of sensitive data.

Popular examples of RDBMS systems include MySQL, PostgreSQL, Oracle Database, Microsoft SQL
Server, and SQLite. These systems are widely used in various applications, from web development to
enterprise-level data management.

Object Database Management System (ODBMS):


 An Object Database Management System (ODBMS) is a type of database management system that
is designed to handle data in an object-oriented programming paradigm.
 It allows for the storage, retrieval, and manipulation of objects directly, without the need for mapping
to relational structures.

Here are some key characteristics and concepts associated with Object DBMS:

1. Object-Oriented Data Model: ODBMS uses an object-oriented data model to represent and store
data. In this model, data is organized as objects, which can encapsulate data attributes and behaviors
(methods).

2. Objects and Classes: In an ODBMS, objects are instances of classes, just as in object-oriented
programming. Classes define the structure and behavior of objects, similar to how classes are
defined in programming languages like Java or C++.

3. Inheritance: ODBMS supports inheritance, allowing one class to inherit attributes and behaviors from
another class. This promotes code reuse and helps in organizing and structuring data.

4. Encapsulation: Objects in an ODBMS encapsulate both data and behavior. This means that data
and the methods that operate on that data are bundled together in a single unit.

5. Polymorphism: ODBMS supports polymorphism, which allows different objects to respond to the
same message (method call) in different ways. This enables dynamic dispatch and flexible behavior.

6. Complex Data Types: ODBMS systems can handle complex data types, including arrays, lists, sets,
and other data structures. This provides flexibility in representing and manipulating data.

7. Persistence: ODBMS systems are designed to persistently store objects, allowing them to be
retrieved and used across multiple sessions or instances of the application.

8. Query Language: ODBMS typically comes with a query language specifically designed for querying
and manipulating objects. This language allows for retrieving objects based on their attributes and
relationships.

9. Object Identity: Every object in an ODBMS has a unique identity. This identity distinguishes one
object from another, even if they have the same attributes.

10. Transaction Management: ODBMS systems provide transaction management capabilities to ensure
that operations on the database are consistent, atomic, and durable.

https://onlinecollegenotes.com
11. Concurrency Control: ODBMS handles concurrency control to manage multiple users accessing
and modifying the same data simultaneously, ensuring that conflicts are resolved appropriately.

Examples of Object DBMS include ObjectDB, db4o, and Versant. These systems are particularly useful
in scenarios where the data and application logic are closely tied together in an object-oriented
programming environment, such as in complex modeling or simulation systems, as well as in
applications involving complex data relationships and structures.

Components
 Components in software engineering refer to modular, reusable units of software that encapsulate
specific functionality.
 They can be thought of as building blocks that can be combined to create more complex systems.

Use and Advantages of Components:

1. Modularity:
 Use: Components break down a software system into smaller, manageable units. Each
component encapsulates a specific functionality or feature.

 Advantage: This modular approach makes it easier to develop, test, and maintain individual parts
of the system. It also facilitates code reuse across different projects.

2. Reusability:
 Use: Components can be designed to be reusable across different parts of a system or in entirely
different projects.

 Advantage: This reduces development time and effort, as well as the likelihood of introducing
bugs. It also promotes consistency in functionality across different parts of the system.

3. Simplicity and Abstraction:


 Use: Components provide a higher level of abstraction, allowing developers to work with familiar,
well-defined interfaces without needing to understand the internal implementation details.

 Advantage: This simplifies the development process, as developers can focus on using the
component's functionality rather than understanding how it works internally.

4. Improved Testing and Debugging:


 Use: Components can be tested in isolation, which makes it easier to identify and fix issues within
a specific functionality.

 Advantage: This leads to more effective testing and debugging, as developers can focus on
specific parts of the system without being overwhelmed by its complexity.

5. Parallel Development:
 Use: Different teams or developers can work on different components simultaneously, as long as
they adhere to the specified interfaces.

https://onlinecollegenotes.com
 Advantage: This accelerates the development process and allows for more efficient use of
resources.

6. Ease of Maintenance and Updates:


 Use: When a component needs to be updated or replaced, it can be done without affecting other
parts of the system, as long as the interface remains consistent.

 Advantage: This reduces the risk of introducing new bugs or unintended side effects when
making changes to the system.

7. Interoperability:
 Use: Components with well-defined interfaces can be integrated with other software systems or
third-party components, enhancing the overall functionality of the application.

 Advantage: This allows for the use of specialized or pre-built components that can extend the
capabilities of the system.

8. Scalability:
 Use: Components can be designed to handle specific tasks or operations. When demand
increases, additional instances of the component can be deployed to distribute the load.

 Advantage: This enables the system to scale efficiently and handle higher levels of traffic or
processing requirements.

9. Code Understandability and Maintainability:


 Use: Components provide clear boundaries between different parts of the system, making it
easier for developers to understand and maintain the code base.

 Advantage: This reduces the cognitive load on developers and makes it easier to add new
features, fix bugs, or update existing functionality.

10. Code Organization and Structure:


 Use: Components enforce a structured approach to organizing code, with well-defined interfaces
and dependencies.

 Advantage: This leads to cleaner, more organized code that is easier to navigate and
comprehend.

Note: Overall, the use of components promotes good software engineering practices, facilitates
teamwork, and contributes to the development of robust, maintainable, and scalable software systems.

https://onlinecollegenotes.com
Component management
 Component management in software development refers to the processes and practices involved in
the identification, organization, utilization, and maintenance of software components.
 It involves handling the various building blocks (modules, libraries, frameworks, etc.) that make up a
software system.

Here are key aspects of component management:

1. Component Identification:
 Determining which components are needed for a specific project or system.
 This involves selecting appropriate libraries, modules, or frameworks that provide the required
functionality.

2. Component Documentation:
 Creating and maintaining comprehensive documentation for each component.
 This includes information on its purpose, functionality, interfaces, dependencies, and usage
guidelines.

3. Version Control:
 Implementing version control systems (such as Git) to track changes, revisions, and versions of
each component.
 This ensures that developers can easily manage and revert to previous versions if needed.

4. Repository Management:
 Setting up and maintaining a central repository or artifact management system to store and
organize components.
 This facilitates easy access, retrieval, and distribution of components within a development team
or organization.

5. Dependency Management:
 Managing the dependencies between components.
 This involves ensuring that each component is compatible with the versions of other components
it relies on.

6. Lifecycle Management:
 Managing the entire lifecycle of a component, from its initial selection and integration, through to
maintenance, updates, and potential retirement or replacement.

7. Component Testing:
 Implementing testing strategies for components to ensure they function correctly and meet
specified requirements.
 This may include unit tests, integration tests, and system-level tests.

8. Security and Compliance:


 Ensuring that components meet security standards and compliance requirements.
 This includes conducting security assessments, vulnerability scans, and adhering to licensing
agreements.

https://onlinecollegenotes.com
9. Reuse and Integration:
 Encouraging the reuse of existing components to save development time and effort.
 This involves identifying opportunities for component reuse across different projects or modules.

10. Component Governance:


 Establishing policies, standards, and procedures for the selection, integration, and management of
components.
 This helps maintain consistency and quality across projects.

11. Monitoring and Maintenance:


 Regularly monitoring the health and performance of components and applying updates or patches
as needed.
 This ensures that components continue to function effectively over time.

12. Retirement and Replacement:


 Identifying components that have become obsolete, inefficient, or no longer meet the project's
requirements.
 Planning for their retirement and replacement with more suitable alternatives.

Note: Effective component management is crucial for building and maintaining robust, scalable, and
maintainable software systems. It helps streamline development processes, improve code quality, and
enhance the overall reliability of the software.

Testing in Software Engineering:


 Testing in software engineering is a systematic process of evaluating software to ensure it functions
correctly, meets requirements, and is free from errors or bugs.
 It plays a crucial role in delivering high-quality, reliable software products.

Use and Benefits of Testing:

1. Identifying and Fixing Issues:


 Testing helps identify defects, errors, and discrepancies in software.
 This allows developers to rectify issues early in the development process, reducing the likelihood
of costly errors in the final product.

2. Ensuring Software Reliability:


 Thorough testing helps ensure that software works reliably and consistently under various
conditions.
 It provides confidence that the software will perform as expected in real-world scenarios.

3. Meeting User Requirements:


 Testing validates that the software meets the specified requirements and fulfills the actual needs
and expectations of end-users.
 This ensures customer satisfaction and user acceptance.

https://onlinecollegenotes.com
4. Reducing Costs and Risks:
 Detecting and fixing defects early in the development process is more cost-effective than
addressing them after deployment.
 Testing helps mitigate risks associated with software failures and malfunctions.

5. Improving Code Quality:


 Testing encourages developers to write clean, well-structured code.
 It promotes good coding practices and enforces quality standards, leading to a higher-quality
software product.

6. Facilitating Maintenance and Updates:


 Comprehensive testing makes it easier to maintain and update software.
 It provides confidence that changes or additions to the codebase won't introduce new problems or
disrupt existing functionality.

7. Enhancing User Experience:


 Effective testing helps ensure a smooth, user-friendly experience.
 It verifies that the user interface and interactions are intuitive, responsive, and error-free.

8. Supporting Continuous Integration and Deployment:


 Testing is integral to the continuous integration and continuous deployment (CI/CD) pipeline.
 It automates the validation of code changes, enabling rapid and reliable software delivery.

9. Boosting Team Confidence:


 Thorough testing instills confidence in development teams, stakeholders, and end-users.
 It provides assurance that the software is robust and reliable, even in complex or critical
applications.

10. Meeting Regulatory and Security Standards:


 Testing helps ensure that software complies with industry-specific regulations and security
standards.
 It identifies vulnerabilities and security risks, allowing for appropriate measures to be
implemented.

11. Enabling Scalability and Performance Optimization:


 Performance testing assesses how well the software handles different levels of load.
 This information is vital for optimizing performance and scalability to meet increasing demands.

12. Demonstrating Professionalism and Accountability:


 Thorough testing demonstrates a commitment to delivering a high-quality product.
 It reflects professionalism and accountability in software development practices.

Note: Testing is a fundamental aspect of software engineering that contributes to the creation of reliable,
efficient, and user-friendly software products. It is a critical step in the software development life cycle
that ultimately leads to higher customer satisfaction and business success.

https://onlinecollegenotes.com
Unit Testing:
 Unit testing is a software testing technique in which individual units or components of a software
application are tested in isolation from the rest of the code.
 A unit refers to the smallest testable part of a software, which is typically a function, method, or
procedure.

Benefits of Unit Testing:

1. Early Bug Detection:


 Unit testing helps identify and fix bugs at an early stage of development, reducing the likelihood of
more serious issues later in the process.

2. Code Confidence:
 Unit tests provide a safety net for developers when making changes to the code.
 Passing unit tests give confidence that existing functionality has not been inadvertently broken.

3. Code Quality and Maintainability:


 Writing unit tests encourages modular and well-structured code, which is easier to understand,
maintain, and extend.

4. Documentation:
 Unit tests serve as documentation for how individual units of code are expected to behave.
 They can act as living examples of how to use the code.

5. Support for Refactoring:


 Unit tests make it easier to refactor code, as they provide a safety net to ensure that existing
functionality is not unintentionally altered.

6. Regression Testing:
 Unit tests can be used for regression testing to ensure that new code changes do not introduce
new bugs into existing functionality.

7. Collaboration and Code Reviews:


 Unit tests provide an objective measure of code correctness.
 They facilitate collaboration among developers and can be used as part of code review processes.

Note: Overall, unit testing is a crucial practice in software development that contributes to the creation of
reliable, maintainable, and high-quality code. It forms an essential part of the larger testing process in the
software development life cycle.

https://onlinecollegenotes.com
Integration Testing:
 Integration testing is a type of software testing that focuses on verifying the interactions and
interfaces between integrated components or modules of a software application.
 The primary goal of integration testing is to ensure that different parts of the system work together as
intended when combined.

Benefits of Integration Testing:

1. Detecting Interface Issues:


 Integration testing helps identify problems related to how different components interact, ensuring
that data and control flow correctly.

2. Validating Data Flow:


 It verifies that data moves between integrated units as expected, confirming that the inputs and
outputs align with the system's specifications.

3. Ensuring Interoperability:
 Integration testing ensures that components developed by different teams or vendors work
together cohesively, even when integrated.

4. Fault Isolation:
 When defects are detected, integration testing provides insights into where the integration issues
are occurring, making it easier to locate and address the root cause.

5. Reducing Post-Deployment Issues:


 By testing interactions before deployment, integration testing helps reduce the likelihood of
integration-related problems occurring in a live environment.

Note: Integration testing is a critical step in the software testing process, ensuring that the integrated
components of a system function harmoniously. It bridges the gap between individual unit testing and
system-level testing, contributing to the overall reliability and functionality of the software application.

Testing Process:
 The testing process in software engineering involves a series of systematic steps and activities
designed to evaluate a software application for quality, functionality, and correctness.
 It ensures that the software meets its specified requirements and performs as expected.

1. Test Planning:
 Define the scope, objectives, resources, and schedule for the testing process.
 Develop test plans and strategies for each type of testing.

2. Test Case Design:


 Create detailed test cases that outline specific scenarios, conditions, and steps to be executed
during testing.
 Include expected outcomes.

https://onlinecollegenotes.com
3. Test Environment Setup:
 Prepare the necessary hardware, software, and infrastructure to conduct the tests.
 This may involve configuring test servers, databases, and other resources.

4. Test Execution:
 Execute the planned test cases using appropriate tools and frameworks.
 Record the results and any deviations from expected outcomes.

5. Defect Reporting:
 Document any defects, errors, or discrepancies identified during testing.
 Provide detailed information, including steps to reproduce the issue.

6. Defect Resolution:
 Developers analyze reported defects, identify root causes, and make necessary code changes to
fix the issues.

7. Regression Testing:
 After making code changes, conduct regression testing to ensure that existing functionality has
not been adversely affected.

8. Retesting:
 Verify that specific defects have been successfully fixed by re-executing the test cases associated
with those issues.

9. Acceptance Testing:
 End-users or stakeholders conduct acceptance testing to validate that the software meets their
requirements and expectations.

10. Deployment and Release:


 Once testing is complete and the software passes all acceptance criteria, it can be deployed for
actual use.

11. Monitoring and Maintenance:


 Continuously monitor the software in production to identify and address any issues that may arise
after deployment.

Note: The testing process is an integral part of software development, ensuring that the software meets
quality standards and functions reliably for end-users. It involves a systematic approach to verification
and validation at different levels of the development cycle.

https://onlinecollegenotes.com

You might also like