This document discusses the principle of separation of concerns in software engineering. It provides an overview of separation of concerns and how it relates to breaking programs into distinct and separate areas of responsibility. The document then provides several examples of how to apply separation of concerns through different techniques like horizontal separation by layer (presentation, business, data), vertical separation by module, aspect-oriented programming for cross-cutting concerns, and dependency inversion. The benefits highlighted include increased reusability, maintainability, code quality, and understandability of the application.
A Separation of Concerns: Clean Architecture on AndroidOutware Mobile
Presented at YOW! Connected 2015 by Kamal Kamal Mohamed & Ryan Hodgman
As an Android developer, I want to deliver features without making compromises on code quality.
Scenario 1 - Given I am dealing with 1000+ line activities, When I have to develop a complicated feature, Then I waste time orienting myself and fixing bugs.
Scenario 2 - Given I have integrated a backend API directly into my app logic, When that API changes, Then I have to refactor large segments of unrelated logic in order to utilise the new API.
Scenario 3 - Given I have cleanly architected my application, When business/presentation/backend logic changes, Then I can easily update the relevant code without breaking unrelated features!
In this talk, two Android developers will present their take on what a cleanly architected app looks like and why it makes our lives easier. A well-defined separation of concerns has benefits not just for our sanity as developers, but also for the project workflow as it allows multiple developers to collaborate on a single feature with ease. We will be exploring how the domain-driven approach can improve code clarity, allow you to easily write tests, and provide a scalable infrastructure for you to quickly iterate on. Join us on our path of discovery as we discuss the advantages, drawbacks and implementation specifics in the context of a small sample project.
Commands, events, queries - three types of messages that travel through your application. Some originate from the web, some from the command-line. Your application sends some of them to a database, or a message queue. What is the ideal infrastructure for an application to support this on-going stream of messages? What kind of architectural design fits best?
This talk provides answers to these questions: we take the *hexagonal* approach to software architecture. We look at messages, how they cross boundaries and how you can make steady communication lines between your application and other systems, like web browsers, terminals, databases and message queues. You will learn how to separate the technical aspects of these connections from the core behavior of your application by implementing design patterns like the *command bus*, and design principles like *dependency inversion*.
A Separation of Concerns: Clean Architecture on AndroidOutware Mobile
Presented at YOW! Connected 2015 by Kamal Kamal Mohamed & Ryan Hodgman
As an Android developer, I want to deliver features without making compromises on code quality.
Scenario 1 - Given I am dealing with 1000+ line activities, When I have to develop a complicated feature, Then I waste time orienting myself and fixing bugs.
Scenario 2 - Given I have integrated a backend API directly into my app logic, When that API changes, Then I have to refactor large segments of unrelated logic in order to utilise the new API.
Scenario 3 - Given I have cleanly architected my application, When business/presentation/backend logic changes, Then I can easily update the relevant code without breaking unrelated features!
In this talk, two Android developers will present their take on what a cleanly architected app looks like and why it makes our lives easier. A well-defined separation of concerns has benefits not just for our sanity as developers, but also for the project workflow as it allows multiple developers to collaborate on a single feature with ease. We will be exploring how the domain-driven approach can improve code clarity, allow you to easily write tests, and provide a scalable infrastructure for you to quickly iterate on. Join us on our path of discovery as we discuss the advantages, drawbacks and implementation specifics in the context of a small sample project.
Commands, events, queries - three types of messages that travel through your application. Some originate from the web, some from the command-line. Your application sends some of them to a database, or a message queue. What is the ideal infrastructure for an application to support this on-going stream of messages? What kind of architectural design fits best?
This talk provides answers to these questions: we take the *hexagonal* approach to software architecture. We look at messages, how they cross boundaries and how you can make steady communication lines between your application and other systems, like web browsers, terminals, databases and message queues. You will learn how to separate the technical aspects of these connections from the core behavior of your application by implementing design patterns like the *command bus*, and design principles like *dependency inversion*.
Over the last year there has been a lot of buzz about Clean Architecture in the Android community, but what is Clean Architecture? How does it work? And should I be using it? Recently at Badoo we decided to rewrite our messenger component.
Over the years this core piece of functionality in our app has become large and unwieldy. We wanted to take a fresh approach to try and prevent this from happening again. We choose to use Clean Architecture to achieve our goal. This talk intends to share our journey from theory to implementation in an application with over 100 million downloads. By the end, you should not only understand what Clean Architecture is, but how to implement it, and whether you should.
Presentation explain about
Spring Boot vs Spring vs Spring MVC,
Advantages,
Where to start and how does Spring boot work ?,
Dependency Management,
Logging,
Exception Handling,
Database Handling.
in Spring boot.
The slides of my talk at Devoxx BE 2017. This in depth talk is all about collectors: those available, because we need to know them, those that we can create, those we had no idea they could be created, and the others, as there is in fact no limit to what can be done with this API. The concept of downstream collector will be used to show how we can write entire data processing pipelines using collectors only, and pass them as parameters to other pipelines.
Understanding MicroSERVICE Architecture with Java & Spring BootKashif Ali Siddiqui
This is a deep journey into the realm of "microservice architecture", and in that I will try to cover each inch of it, but with a fixed tech stack of Java with Spring Cloud. Hence in the end, you will be get know each and every aspect of this distributed design, and will develop an understanding of each and every concern regarding distributed system construct.
This talk introduces Spring's REST stack - Spring MVC, Spring HATEOAS, Spring Data REST, Spring Security OAuth and Spring Social - while refining an API to move higher up the Richardson maturity model
So you're starting a startup an need best practices for your engineering team. Well, look for:
1. Versionning
2. Branching and Pull Requests (GitHub Flow)
3. Deployment & Continuous Delivery
4. Rollback Strategies
5. Testing
6. Backups
7. Monitoring
8. Communication
9. Issue Tracker / Project Management
This deck talks about the tool used by Le Wagon and startup coached by Le Wagon.
Le Wagon is the French innovating coding school for entrepreneurs. More info on https://www.lewagon.com
Asynchronous API in Java8, how to use CompletableFutureJosé Paumard
Slides of my talk as Devoxx 2015. How to set up asynchronous data processing pipelines using the CompletionStage / CompletableFuture API, including how to control threads and how to handle exceptions.
Spring Data is a high level SpringSource project whose purpose is to unify and ease the access to different kinds of persistence stores, both relational database systems and NoSQL data stores.
Over the last year there has been a lot of buzz about Clean Architecture in the Android community, but what is Clean Architecture? How does it work? And should I be using it? Recently at Badoo we decided to rewrite our messenger component.
Over the years this core piece of functionality in our app has become large and unwieldy. We wanted to take a fresh approach to try and prevent this from happening again. We choose to use Clean Architecture to achieve our goal. This talk intends to share our journey from theory to implementation in an application with over 100 million downloads. By the end, you should not only understand what Clean Architecture is, but how to implement it, and whether you should.
Presentation explain about
Spring Boot vs Spring vs Spring MVC,
Advantages,
Where to start and how does Spring boot work ?,
Dependency Management,
Logging,
Exception Handling,
Database Handling.
in Spring boot.
The slides of my talk at Devoxx BE 2017. This in depth talk is all about collectors: those available, because we need to know them, those that we can create, those we had no idea they could be created, and the others, as there is in fact no limit to what can be done with this API. The concept of downstream collector will be used to show how we can write entire data processing pipelines using collectors only, and pass them as parameters to other pipelines.
Understanding MicroSERVICE Architecture with Java & Spring BootKashif Ali Siddiqui
This is a deep journey into the realm of "microservice architecture", and in that I will try to cover each inch of it, but with a fixed tech stack of Java with Spring Cloud. Hence in the end, you will be get know each and every aspect of this distributed design, and will develop an understanding of each and every concern regarding distributed system construct.
This talk introduces Spring's REST stack - Spring MVC, Spring HATEOAS, Spring Data REST, Spring Security OAuth and Spring Social - while refining an API to move higher up the Richardson maturity model
So you're starting a startup an need best practices for your engineering team. Well, look for:
1. Versionning
2. Branching and Pull Requests (GitHub Flow)
3. Deployment & Continuous Delivery
4. Rollback Strategies
5. Testing
6. Backups
7. Monitoring
8. Communication
9. Issue Tracker / Project Management
This deck talks about the tool used by Le Wagon and startup coached by Le Wagon.
Le Wagon is the French innovating coding school for entrepreneurs. More info on https://www.lewagon.com
Asynchronous API in Java8, how to use CompletableFutureJosé Paumard
Slides of my talk as Devoxx 2015. How to set up asynchronous data processing pipelines using the CompletionStage / CompletableFuture API, including how to control threads and how to handle exceptions.
Spring Data is a high level SpringSource project whose purpose is to unify and ease the access to different kinds of persistence stores, both relational database systems and NoSQL data stores.
In 2010, I told everyone how to start unit testing Zend Framework applications. In 2011, let’s take this a step further by testing services, work flows and performance. Looking to raise the bar on quality? Let this talk be the push you need to improve your Zend Framework projects.
n 2010, I told everyone how to start unit testing Zend Framework applications. In 2011, let’s take this a step further by testing services, work flows and performance. Looking to raise the bar on quality? Let this talk be the push you need to improve your Zend Framework projects.
Lithium: The Framework for People Who Hate FrameworksNate Abele
This is the presentation was given at ConFoo on March 11th by Nate Abele and Joël Perras, and is an introduction to the architectural problems with other frameworks that Lithium was designed to address, and how it addresses them. It also introduces programming paradigms like functional and aspect-oriented programming which address issues that OOP doesn't account for.
Finally, the talk provides a quick overview of the innovative and unparalleled features that Lithium provides, including the data layer, which supports both relational and non-relational databases.
Refactoring, Agile Entwicklung, Continuous Integration – all diese für nachhaltigen Erfolg wichtigen Vorgehensweisen setzen Erfahrung mit Unit Testing voraus. Abseits von den üblichen "Bowling"-Beispielen möchten wir gerne einen Crashkurs inkl. Best Practices für das erfolgreiche Unit Testing durchführen. Anhand eines Beispielprojekts auf Basis des Zend Frameworks werden wir nach der Installation von PHPUnit auf allen Notebooks gemeinsam eine kleine Applikation aufbauen, die durchgehend Test-driven entwickelt wird.
The Art of the Pitch: WordPress Relationships and SalesLaura Byrne
Clients don’t know what they don’t know. What web solutions are right for them? How does WordPress come into the picture? How do you make sure you understand scope and timeline? What do you do if sometime changes?
All these questions and more will be explored as we talk about matching clients’ needs with what your agency offers without pulling teeth or pulling your hair out. Practical tips, and strategies for successful relationship building that leads to closing the deal.
Elevating Tactical DDD Patterns Through Object CalisthenicsDorra BARTAGUIZ
After immersing yourself in the blue book and its red counterpart, attending DDD-focused conferences, and applying tactical patterns, you're left with a crucial question: How do I ensure my design is effective? Tactical patterns within Domain-Driven Design (DDD) serve as guiding principles for creating clear and manageable domain models. However, achieving success with these patterns requires additional guidance. Interestingly, we've observed that a set of constraints initially designed for training purposes remarkably aligns with effective pattern implementation, offering a more ‘mechanical’ approach. Let's explore together how Object Calisthenics can elevate the design of your tactical DDD patterns, offering concrete help for those venturing into DDD for the first time!
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Albert Hoitingh
In this session I delve into the encryption technology used in Microsoft 365 and Microsoft Purview. Including the concepts of Customer Key and Double Key Encryption.
Accelerate your Kubernetes clusters with Varnish CachingThijs Feryn
A presentation about the usage and availability of Varnish on Kubernetes. This talk explores the capabilities of Varnish caching and shows how to use the Varnish Helm chart to deploy it to Kubernetes.
This presentation was delivered at K8SUG Singapore. See https://feryn.eu/presentations/accelerate-your-kubernetes-clusters-with-varnish-caching-k8sug-singapore-28-2024 for more details.
JMeter webinar - integration with InfluxDB and GrafanaRTTS
Watch this recorded webinar about real-time monitoring of application performance. See how to integrate Apache JMeter, the open-source leader in performance testing, with InfluxDB, the open-source time-series database, and Grafana, the open-source analytics and visualization application.
In this webinar, we will review the benefits of leveraging InfluxDB and Grafana when executing load tests and demonstrate how these tools are used to visualize performance metrics.
Length: 30 minutes
Session Overview
-------------------------------------------
During this webinar, we will cover the following topics while demonstrating the integrations of JMeter, InfluxDB and Grafana:
- What out-of-the-box solutions are available for real-time monitoring JMeter tests?
- What are the benefits of integrating InfluxDB and Grafana into the load testing stack?
- Which features are provided by Grafana?
- Demonstration of InfluxDB and Grafana using a practice web application
To view the webinar recording, go to:
https://www.rttsweb.com/jmeter-integration-webinar
Connector Corner: Automate dynamic content and events by pushing a buttonDianaGray10
Here is something new! In our next Connector Corner webinar, we will demonstrate how you can use a single workflow to:
Create a campaign using Mailchimp with merge tags/fields
Send an interactive Slack channel message (using buttons)
Have the message received by managers and peers along with a test email for review
But there’s more:
In a second workflow supporting the same use case, you’ll see:
Your campaign sent to target colleagues for approval
If the “Approve” button is clicked, a Jira/Zendesk ticket is created for the marketing design team
But—if the “Reject” button is pushed, colleagues will be alerted via Slack message
Join us to learn more about this new, human-in-the-loop capability, brought to you by Integration Service connectors.
And...
Speakers:
Akshay Agnihotri, Product Manager
Charlie Greenberg, Host
UiPath Test Automation using UiPath Test Suite series, part 3DianaGray10
Welcome to UiPath Test Automation using UiPath Test Suite series part 3. In this session, we will cover desktop automation along with UI automation.
Topics covered:
UI automation Introduction,
UI automation Sample
Desktop automation flow
Pradeep Chinnala, Senior Consultant Automation Developer @WonderBotz and UiPath MVP
Deepak Rai, Automation Practice Lead, Boundaryless Group and UiPath MVP
GraphRAG is All You need? LLM & Knowledge GraphGuy Korland
Guy Korland, CEO and Co-founder of FalkorDB, will review two articles on the integration of language models with knowledge graphs.
1. Unifying Large Language Models and Knowledge Graphs: A Roadmap.
https://arxiv.org/abs/2306.08302
2. Microsoft Research's GraphRAG paper and a review paper on various uses of knowledge graphs:
https://www.microsoft.com/en-us/research/blog/graphrag-unlocking-llm-discovery-on-narrative-private-data/
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Jeffrey Haguewood
Sidekick Solutions uses Bonterra Impact Management (fka Social Solutions Apricot) and automation solutions to integrate data for business workflows.
We believe integration and automation are essential to user experience and the promise of efficient work through technology. Automation is the critical ingredient to realizing that full vision. We develop integration products and services for Bonterra Case Management software to support the deployment of automations for a variety of use cases.
This video focuses on the notifications, alerts, and approval requests using Slack for Bonterra Impact Management. The solutions covered in this webinar can also be deployed for Microsoft Teams.
Interested in deploying notification automations for Bonterra Impact Management? Contact us at sales@sidekicksolutionsllc.com to discuss next steps.
2. Separation of concerns
About Joshua
Joshua Thijssen, NoxLogic / Techademy
Freelance Consultant, Developer, Trainer
Development in PHP, Python, Perl, C, Java
jthijssen@noxlogic.nl
@jaytaph
3. Separation of concerns
About Stephan
Stephan Hochdörfer, bitExpert AG
Department Manager Research Labs
enjoying PHP since 1999
S.Hochdoerfer@bitExpert.de
@shochdoerfer
4. Separation of concerns
It is what I sometimes have called the
separation of concerns, which [...] is
yet the only available technique for
effective ordering of one's thoughts.
Edsger W. Dijkstra, "On the role of scientific thought" (1974)
5. Separation of concerns
SoC […] is the process of breaking a
computer program into distinct
features that overlap in functionality
as little as possible.
http://en.wikipedia.org/wiki/Separation_of_concerns
24. Separation of concerns
<?php
interface ConnectorInterface {
/**
* Will return an array of the latest posts.
* return array
*/
public function getLatestPosts() {
}
}
25. Separation of concerns
<?php
class FacebookConnector implements ConnectorInterface {
protected $handle;
public function __construct($handle) {
$this->handle = $handle;
}
public function getLatestPosts() {
$items = array();
$token = file_get_contents("https://graph.facebook.com/oauth/access...");
$feed = file_get_contents("https://graph.facebook.com/.
$this->handle."/feed?".$token);
$feed = json_decode($feed, true);
foreach($feed['data'] as $post) {
if('123456789012' === $post['from']['id']) {
$items[] = array(
'date' => strtotime($post['created_time']),
'message' => $post['message']);
}
}
return $items;
}
}
26. Separation of concerns
<?php
class FacebookConnector implements ConnectorInterface {
protected $handle;
public function __construct($handle) {
$this->handle = $handle;
}
public function getLatestPosts() {
$token = $this->getAccessToken();
return $this->readPosts($token);
}
protected function getAccessToken() {
return file_get_contents("https://graph.facebook.com/oauth/access_?...");
}
protected function readPosts($token) {
// read the post, filter all relevant and return them...
}
}
27. Separation of concerns
<?php
class FacebookConnectorV2 extends FacebookConnector {
protected function getAccessToken() {
return md5($this->handle);
}
}
Easy to extend, will not influence
the behaviour of other methods!
28. Separation of concerns
<?php
namespace AcmeDemoBundleController;
use SymfonyBundleFrameworkBundleControllerController;
use SensioBundleFrameworkExtraBundleConfigurationRoute;
use SensioBundleFrameworkExtraBundleConfigurationTemplate;
class DemoController extends Controller {
/**
* @Route("/", name="_demo")
* @Template()
*/
public function indexAction() {
$items = array();
$fb = $this->get('FbConnector');
$items += $fb->getLatestPosts();
$feed = file_get_contents("http://search.twitter.com/search.json?...");
$feed = json_decode($feed, true);
foreach($feed['results'] as $tweet) {
$items[] = array(
'date' => strtotime($tweet['created_at']),
'message' => $tweet['text']);
}
29. Separation of concerns
<?php
namespace AcmeDemoBundleController;
use SymfonyBundleFrameworkBundleControllerController;
use SensioBundleFrameworkExtraBundleConfigurationRoute;
use SensioBundleFrameworkExtraBundleConfigurationTemplate;
class DemoController extends Controller {
/**
* @Route("/", name="_demo")
* @Template()
*/
public function indexAction() {
$items = array();
$fb = $this->get('FbConnector');
$items += $fb->getLatestPosts();
$twitter = $this->get('TwitterConnector');
$items += $twitter->getLatestPosts();
return array('items' => $items);
}
}
44. Separation of concerns
How to separate? Vertical Separation
./symfony
|-app
|---cache
|---config
|---Resources
|-src
|---Acme
|-----AdminBundle
|-------Controller
|-------Resources
|-------Tests
|-----ProductsBundle
|-------Controller
|-------Resources
|-------Tests
|-----CustomersBundle
|-------Controller
|-------Resources
|-------Tests
|-web
45. Separation of concerns
How to separate? Vertical Separation
Presentation Presentation Presentation
Layer Layer Layer
Business Business Business
Layer Layer Layer
Resource Resource Resource
Access Layer Access Layer Access Layer
46. Separation of concerns
How to separate? Vertical Separation
./symfony
|-app
|---cache
|---config
|---Resources
|-src
|---Acme
|-----AdminBundle
|-------Controller
|-------Resources
|-------Tests
|-----ProductsBundle
|-------Controller
|-------Resources
|-------Tests
|-----CustomersBundle
|-------Controller
|-------Resources
|-------Tests
|-web
47. Separation of concerns
Cross-cutting concerns?
How to deal with security or logging
aspects?
48. Separation of concerns
How to separate? Aspect Separation
Aspects
Presentation Layer
Business Layer
Resource Access Layer
49. Separation of concerns
How to separate? Aspect Separation
<?php
namespace AcmeProductsAspects;
/**
* @FLOW3Aspect
*/
class LoggingAspect {
/**
* @FLOW3Inject
* @var AcmeLoggerLoggerInterface
*/
protected $logger;
/**
* @param TYPO3FLOW3AOPJoinPointInterface $joinPoint
* @FLOW3Before("method(AcmeProductsModelProduct->delete())")
*/
public function log(TYPO3FLOW3AOPJoinPointInterface $jp) {
$product = $jp->getMethodArgument('product');
$this->logger->info('Removing ' .
$product->getName());
}
}
51. Separation of concerns
Dependency Direction
"High-level modules should not
depend on low-level modules.
Both should depend on
abstractions."
Robert C. Martin
52. Separation of concerns
Inverting Concerns
Presentation
Layer
Business
Layer
Resource
Access Layer
53. Separation of concerns
Inverting Concerns
Presentation UI Presentation
Layer Component Layer
Business Business
Layer Layer
Resource Resource
Access Layer Access Layer
54. Separation of concerns
Inverting Concerns
The goal of Dependency Injection
is to separate the concerns of
obtaining the dependencies from
the core concerns of a component.