SlideShare a Scribd company logo
1 of 140
Download to read offline
PHPSpecthe only Design Tool you need
flickr.com/dad/5528226004
Kacper Gunia @cakper
Software Engineer @SensioLabsUK
Symfony Certified Developer
PHPers Silesia @PHPersPL
!
‘Is my code well 

designed?’
’That’s not the way
I would have done it…’
It’s hard to

change!
It’s hard to
change!Rigidity
We're afraid
to change it…
We're
to change itFragility
We cannot

reuse it!
We cannot
reuse it!Immobility
What is
Design
about?
‘The key in making great and
growable systems is much more to
design how its
modules communicate
rather than what their internal
properties and behaviors should be.’
Alan Kay
Design is about
Messaging
$orders	
  =	
  $orderRepository	
  
	
  	
  -­‐>getEntityManager()	
  
	
  	
  	
  -­‐>createOrderQuery($customer)	
  
	
  	
  	
  -­‐>execute();
$orders	
  =	
  $orderRepository	
  
	
  	
  -­‐>findBy($customer);	
  
!
We have
to refactor! :)
We need
two weeks
to refactor! :)
We need
two sprints
to refactor! :|
We need
two months
to refactor! :/
Refactoring
is the process of restructuring
existing code without
changing its external behavior
4 Rules of Simple Design
1. Passes its tests
2. Minimizes duplication
3. Maximizes clarity
4. Has fewer elements
…so we need
to write
Tests!
how
to write
Tests?
Tests
Driven
Development
Red
GreenRefactor
Red
GreenRefactor
But!
How to test
something that
doesn’t exist?
flickr.com/ucumari/580865728/
Test in TDD
means
specification
Specification
describes
behavior
Behavior
Driven
Development
BDD improves
Naming
Conventions
Tools
Story BDD
vs
Spec BDD
Story BDD
description of
business-targeted
application behavior
Spec BDD
specification for
low-level
implementation
http://phpspec.net/
Spec BDD
tool created by
@_md & @everzet
Bundled with
mocking library
Prophecy
But!
Isn’t it a tool just
like PHPUnit?
PHPUnit is a
Testing Tool
PHPSpec is the
Design Tool
class	
  CustomerRepositoryTest	
  extends	
  
PHPUnit_Framework_TestCase	
  
{	
  
	
  	
  	
  	
  function	
  testFindCustomerById()	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $customerRepository	
  =	
  new	
  CustomerRepository;	
  
!
	
  	
  	
  	
  	
  	
  	
  	
  $customer	
  =	
  $customerRepository-­‐>findById(5);	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>assertInstanceOf('Customer',	
  $customer);	
  
	
  	
  	
  	
  }	
  
}
class	
  CustomerRepositorySpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  	
  	
  function	
  it_is_initializable()	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>shouldHaveType('CustomerRepository');	
  
	
  	
  	
  	
  }	
  
}
Naming
TestCase
!
Specification
Test
!
Example
Assertion
!
Expectation
OK, so how to
specify a method?
What method can do?
return a value
modify state
delegate
throw an exception
Command-Query
Separation
Command
change the state of a system
but do not return a value
Query
return a result and do not
change the state of the
system (free of side effects)
Never both!
class	
  CustomerRepositorySpec	
  extends	
  ObjectBehavior	
  
{	
  
	
  	
  	
  	
  function	
  it_loads_user_preferences()	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $customer	
  =	
  $this-­‐>findById(5);	
  
!
	
  	
  	
  	
  	
  	
  	
  	
  $customer-­‐>shouldBeAnInstanceOf('Customer');	
  
	
  	
  	
  	
  }	
  
}
Matchers
Type
shouldBeAnInstanceOf(*)
shouldReturnAnInstanceOf(*)
shouldHaveType(*)
$customer-­‐>shouldBeAnInstanceOf('Customer');
Identity ===
shouldReturn(*)
shouldBe(*)
shouldEqual(*)
shouldBeEqualTo(*)
$this-­‐>findById(-­‐1)-­‐>shouldReturn(null);
Comparison ==
shouldBeLike(*)
$this-­‐>getAmount()-­‐>shouldBeLike(5);
Throw
throw(*)->during*()
$this-­‐>shouldThrow(‘InvalidArgumentException’)

	
  	
  	
  	
  	
  -­‐>duringFindByCustomer(null);
Object State
shouldHave*()
$car-­‐>hasEngine();	
  
!
$this-­‐>shouldHaveEngine();
Scalar
shouldBeString()
shouldBeArray()
Count
shouldHaveCount(*)
Or write your own
Inline Matcher
function	
  it_should_have_holland_as_avialable_country()	
  
{	
  
	
  	
  	
  	
  $this-­‐>getCountryCodes()-­‐>shouldHaveValue('NL');	
  
}	
  
!
public	
  function	
  getMatchers()	
  
{	
  
	
  	
  	
  	
  return	
  [	
  
	
  	
  	
  	
  	
  	
  	
  	
  'haveValue'	
  =>	
  function	
  ($subject,	
  $value)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  in_array($value,	
  $subject);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  ];	
  
}
But!
Design is about
Messaging!
And (so far) there
is no messaging…
London School
Mockist TDD
only tested object is real
Test Doubles
Dummy
tested code requires
parameter but
doesn’t need to use it
function	
  let(EntityManager	
  $entityManager)	
  
{	
  
	
  	
  	
  	
  $this-­‐>beConstructedWith($entityManager);	
  
}	
  
!
function	
  it_returns_customer_by_id()	
  
{	
  
	
  	
  	
  	
  $customer	
  =	
  $this-­‐>findById(5);	
  
!
	
  	
  	
  	
  $customer-­‐>shouldBeAnInstanceOf('Customer');	
  
	
  	
  	
  	
  }	
  
}
function	
  let(EntityManager	
  $entityManager)	
  
{	
  
	
  	
  	
  	
  $this-­‐>beConstructedWith($entityManager);	
  
}	
  
!
function	
  it_returns_customer_by_id()	
  
{	
  
	
  	
  	
  	
  $customer	
  =	
  $this-­‐>findById(5);	
  
!
	
  	
  	
  	
  $customer-­‐>shouldBeAnInstanceOf('Customer');	
  
	
  	
  	
  	
  }	
  
}
Stub
provides "indirect input"
to the tested code
function	
  it_bolds_the_output(Stream	
  $stream)	
  
{	
  
	
  	
  	
  	
  $stream-­‐>getOutput()	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>willReturn('DPC');	
  
!
	
  	
  	
  	
  $this-­‐>bold($stream)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldReturn('<b>DPC</b>’);	
  
}
function	
  it_bolds_the_output(Stream	
  $stream)	
  
{	
  
	
  	
  	
  	
  $stream-­‐>getOutput()	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>willReturn('DPC');	
  
!
	
  	
  	
  	
  $this-­‐>bold($stream)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldReturn('<b>DPC</b>’);	
  
}
Mocks
verifies "indirect output”
of the tested code
function	
  let(Logger	
  $logger)	
  
{	
  
	
  	
  	
  	
  $this-­‐>beConstructedWith($logger);	
  
}	
  
!
function	
  it_returns_customer_by_id(Logger	
  $logger)	
  
{	
  
	
  	
  	
  	
  $logger-­‐>debug('DB	
  queried')	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldBeCalled();	
  
!
	
  	
  	
  	
  $this-­‐>findById(5);	
  
}
function	
  let(Logger	
  $logger)	
  
{	
  
	
  	
  	
  	
  $this-­‐>beConstructedWith($logger);	
  
}	
  
!
function	
  it_returns_customer_by_id(Logger	
  $logger)	
  
{	
  
	
  	
  	
  	
  $logger-­‐>debug('DB	
  queried')	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldBeCalled();	
  
!
	
  	
  	
  	
  $this-­‐>findById(5);	
  
}
Spy
verifies "indirect output”
by asserting the expectations
afterwards
function	
  let(Logger	
  $logger)	
  
{	
  
	
  	
  	
  	
  $this-­‐>beConstructedWith($logger);	
  
}	
  
!
function	
  it_returns_customer_by_id(Logger	
  $logger)	
  
{	
  
	
  	
  	
  	
  $this-­‐>findById(5);	
  
!
	
  	
  	
  	
  $logger-­‐>debug('DB	
  queried')	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldHaveBeenCalled();	
  
}
function	
  let(Logger	
  $logger)	
  
{	
  
	
  	
  	
  	
  $this-­‐>beConstructedWith($logger);	
  
}	
  
!
function	
  it_returns_customer_by_id(Logger	
  $logger)	
  
{	
  
	
  	
  	
  	
  $this-­‐>findById(5);	
  
!
	
  	
  	
  	
  $logger-­‐>debug('DB	
  queried')	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldHaveBeenCalled();	
  
}
(a bit more)
complex example
function	
  let(SecurityContext	
  $securityContext)	
  {	
  
	
  	
  	
  	
  $this-­‐>beConstructedWith($securityContext);	
  	
  
}	
  
!
function	
  it_loads_user_preferences(	
  
	
  	
  	
  	
  GetResponseEvent	
  $event,	
  SecurityContext	
  $securityContext,	
  	
  
	
  	
  	
  	
  TokenInterface	
  $token,	
  User	
  $user)	
  	
  
{	
  
	
  	
  	
  	
  $securityContext-­‐>getToken()-­‐>willReturn($token);	
  
	
  	
  	
  	
  $token-­‐>getUser()-­‐>willReturn($user);	
  
!
	
  	
  	
  	
  $user-­‐>setPreferences(Argument::type('Preferences'))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldBeCalled();	
  
!
	
  	
  	
  	
  $this-­‐>handle($event);	
  	
  
}
function	
  let(SecurityContext	
  $securityContext)	
  {	
  
	
  	
  	
  	
  $this-­‐>beConstructedWith($securityContext);	
  	
  
}	
  
!
function	
  it_loads_user_preferences(	
  
	
  	
  	
  	
  GetResponseEvent	
  $event,	
  SecurityContext	
  $securityContext,	
  	
  
	
  	
  	
  	
  TokenInterface	
  $token,	
  User	
  $user)	
  	
  
{	
  
	
  	
  	
  	
  $securityContext-­‐>getToken()-­‐>willReturn($token);	
  
	
  	
  	
  	
  $token-­‐>getUser()-­‐>willReturn($user);	
  
!
	
  	
  	
  	
  $user-­‐>setPreferences(Argument::type('Preferences'))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldBeCalled();	
  
!
	
  	
  	
  	
  $this-­‐>handle($event);	
  	
  
}
function	
  let(SecurityContext	
  $securityContext)	
  {	
  
	
  	
  	
  	
  $this-­‐>beConstructedWith($securityContext);	
  	
  
}	
  
!
function	
  it_loads_user_preferences(	
  
	
  	
  	
  	
  GetResponseEvent	
  $event,	
  SecurityContext	
  $securityContext,	
  	
  
	
  	
  	
  	
  TokenInterface	
  $token,	
  User	
  $user)	
  	
  
{	
  
	
  	
  	
  	
  $securityContext-­‐>getToken()-­‐>willReturn($token);	
  
	
  	
  	
  	
  $token-­‐>getUser()-­‐>willReturn($user);	
  
!
	
  	
  	
  	
  $user-­‐>setPreferences(Argument::type('Preferences'))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldBeCalled();	
  
!
	
  	
  	
  	
  $this-­‐>handle($event);	
  	
  
}
function	
  let(SecurityContext	
  $securityContext)	
  {	
  
	
  	
  	
  	
  $this-­‐>beConstructedWith($securityContext);	
  	
  
}	
  
!
function	
  it_loads_user_preferences(	
  
	
  	
  	
  	
  GetResponseEvent	
  $event,	
  SecurityContext	
  $securityContext,	
  	
  
	
  	
  	
  	
  TokenInterface	
  $token,	
  User	
  $user)	
  	
  
{	
  
	
  	
  	
  	
  $securityContext-­‐>getToken()-­‐>willReturn($token);	
  
	
  	
  	
  	
  $token-­‐>getUser()-­‐>willReturn($user);	
  
!
	
  	
  	
  	
  $user-­‐>setPreferences(Argument::type('Preferences'))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldBeCalled();	
  
!
	
  	
  	
  	
  $this-­‐>handle($event);	
  	
  
}
function	
  let(SecurityContext	
  $securityContext)	
  {	
  
	
  	
  	
  	
  $this-­‐>beConstructedWith($securityContext);	
  	
  
}	
  
!
function	
  it_loads_user_preferences(	
  
	
  	
  	
  	
  GetResponseEvent	
  $event,	
  SecurityContext	
  $securityContext,	
  	
  
	
  	
  	
  	
  TokenInterface	
  $token,	
  User	
  $user)	
  	
  
{	
  
	
  	
  	
  	
  $securityContext-­‐>getToken()-­‐>willReturn($token);	
  
	
  	
  	
  	
  $token-­‐>getUser()-­‐>willReturn($user);	
  
!
	
  	
  	
  	
  $user-­‐>setPreferences(Argument::type('Preferences'))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldBeCalled();	
  
!
	
  	
  	
  	
  $this-­‐>handle($event);	
  	
  
}
But mocking
becomes painful…
And it smells…
Law of Demeter
unit should only
talk to its friends;
don't talk to strangers
It’s time to
refactor! :)
function	
  it_loads_user_preferences(	
  
	
  	
  	
  	
  GetResponseEvent	
  $event,	
  	
  
	
  	
  	
  	
  SecurityContext	
  $securityContext,	
  	
  
	
  	
  	
  	
  TokenInterface	
  $token,	
  User	
  $user)	
  	
  
{	
  
	
  	
  	
  	
  $securityContext-­‐>getToken()-­‐>willReturn($token);	
  
	
  	
  	
  	
  $token-­‐>getUser()-­‐>willReturn($user);	
  
!
	
  	
  	
  	
  $user-­‐>setPreferences(Argument::type('Preferences'))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldBeCalled();	
  
!
	
  	
  	
  	
  $this-­‐>handle($event);	
  	
  
}
function	
  it_returns_user_from_token(	
  
	
  	
  	
  	
  SecurityContext	
  $securityContext,	
  	
  
	
  	
  	
  	
  TokenInterface	
  $token,	
  User	
  $user)	
  
{	
  
	
  	
  	
  	
  $securityContext-­‐>getToken()-­‐>willReturn($token);	
  
	
  	
  	
  	
  $token-­‐>getUser()-­‐>willReturn($user);	
  
!
	
  	
  	
  	
  $this-­‐>getUser()-­‐>shouldReturn($user);	
  
}	
  
!
public	
  function	
  __construct(SecurityContext	
  $securityContext){	
  
	
  	
  	
  	
  $this-­‐>securityContext	
  =	
  $securityContext;	
  
}	
  
!
public	
  function	
  getUser()	
  
{	
  
	
  	
  	
  	
  $token	
  =	
  $this-­‐>securityContext-­‐>getToken();	
  
	
  	
  	
  	
  if	
  ($token	
  instanceof	
  TokenInterface)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  $token-­‐>getUser();	
  
	
  	
  	
  	
  }	
  
!
	
  	
  	
  	
  return	
  null;	
  
}
function	
  it_loads_user_preferences(	
  
	
  	
  	
  	
  GetResponseEvent	
  $event,	
  	
  
	
  	
  	
  	
  SecurityContext	
  $securityContext,	
  	
  
	
  	
  	
  	
  TokenInterface	
  $token,	
  User	
  $user)	
  	
  
{	
  
	
  	
  	
  	
  $securityContext-­‐>getToken()-­‐>willReturn($token);	
  
	
  	
  	
  	
  $token-­‐>getUser()-­‐>willReturn($user);	
  
!
	
  	
  	
  	
  $user-­‐>setPreferences(Argument::type('Preferences'))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldBeCalled();	
  
!
	
  	
  	
  	
  $this-­‐>handle($event);	
  	
  
}
function	
  it_loads_user_preferences(	
  
	
  	
  	
  	
  GetResponseEvent	
  $event,	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  DomainSecurityContext	
  $securityContext,	
  

	
  	
  	
  	
  User	
  $user)	
  
{	
  
	
  	
  	
  	
  $securityContext-­‐>getUser()-­‐>willReturn($user);	
  
!
	
  	
  	
  	
  $user-­‐>setPreferences(Argument::type(‘Preferences'))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldBeCalled();	
  
!
	
  	
  	
  	
  $this-­‐>handle($event);	
  
}	
  
Composition over Inheritance
separation of concerns
small, well focused objects
composition is simpler to test
public	
  function	
  __construct(SecurityContext	
  $securityContext){	
  
	
  	
  	
  	
  $this-­‐>securityContext	
  =	
  $securityContext;	
  
}	
  
!
public	
  function	
  getUser()	
  
{	
  
	
  	
  	
  	
  $token	
  =	
  $this-­‐>securityContext-­‐>getToken();	
  
	
  	
  	
  	
  if	
  ($token	
  instanceof	
  TokenInterface)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  $token-­‐>getUser();	
  
	
  	
  	
  	
  }	
  
!
	
  	
  	
  	
  return	
  null;	
  
}
We can still
improve
function	
  it_loads_user_preferences(	
  
	
  	
  	
  	
  GetResponseEvent	
  $event,	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  DomainSecurityContext	
  $securityContext,	
  

	
  	
  	
  	
  User	
  $user)	
  
{	
  
	
  	
  	
  	
  $securityContext-­‐>getUser()-­‐>willReturn($user);	
  
!
	
  	
  	
  	
  $user-­‐>setPreferences(Argument::type(‘Preferences'))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldBeCalled();	
  
!
	
  	
  	
  	
  $this-­‐>handle($event);	
  
}	
  
function	
  it_loads_user_preferences(	
  
	
  	
  	
  	
  GetResponseEvent	
  $event,	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  DomainSecurityContextInterface	
  $securityContext,	
  

	
  	
  	
  	
  User	
  $user)	
  
{	
  
	
  	
  	
  	
  $securityContext-­‐>getUser()-­‐>willReturn($user);	
  
!
	
  	
  	
  	
  $user-­‐>setPreferences(Argument::type(‘Preferences'))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>shouldBeCalled();	
  
!
	
  	
  	
  	
  $this-­‐>handle($event);	
  
}	
  
Dependency
Inversion Principle
high-level modules should
not depend on low-level
modules; both should depend
on abstractions
DIP states:
DIP states:
abstractions should not
depend upon details; details
should depend upon
abstractions
Isn’t it overhead?
What are benefits of
using PHPSpec?
TDD-cycle
oriented tool
ease Mocking
focused on
Messaging
encourages
injecting right
Collaborators
and following
Law of Demeter
enables
Refactoring
and gives you
Regression Safety
and it’s trendy ;)
Is PHPSpec
the only design tool
we need?
s
So it helps ;)
Kacper Gunia
Software Engineer
Symfony Certified Developer
PHPers Silesia
Thanks!
joind.in/10864

More Related Content

What's hot

Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design PatternsHugo Hamon
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistenceHugo Hamon
 
PHPSpec - the only Design Tool you need - 4Developers
PHPSpec - the only Design Tool you need - 4DevelopersPHPSpec - the only Design Tool you need - 4Developers
PHPSpec - the only Design Tool you need - 4DevelopersKacper Gunia
 
Command Bus To Awesome Town
Command Bus To Awesome TownCommand Bus To Awesome Town
Command Bus To Awesome TownRoss Tuck
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & RESTHugo Hamon
 
Decoupling the Ulabox.com monolith. From CRUD to DDD
Decoupling the Ulabox.com monolith. From CRUD to DDDDecoupling the Ulabox.com monolith. From CRUD to DDD
Decoupling the Ulabox.com monolith. From CRUD to DDDAleix Vergés
 
Rich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 ApplicationRich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 ApplicationKirill Chebunin
 
Adding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy ApplicationsAdding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy ApplicationsSam Hennessy
 
Forget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers CracowForget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers CracowKacper Gunia
 
November Camp - Spec BDD with PHPSpec 2
November Camp - Spec BDD with PHPSpec 2November Camp - Spec BDD with PHPSpec 2
November Camp - Spec BDD with PHPSpec 2Kacper Gunia
 
Design how your objects talk through mocking
Design how your objects talk through mockingDesign how your objects talk through mocking
Design how your objects talk through mockingKonstantin Kudryashov
 
Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Konstantin Kudryashov
 
When cqrs meets event sourcing
When cqrs meets event sourcingWhen cqrs meets event sourcing
When cqrs meets event sourcingManel Sellés
 
PHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolvePHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolveXSolve
 
Things I Believe Now That I'm Old
Things I Believe Now That I'm OldThings I Believe Now That I'm Old
Things I Believe Now That I'm OldRoss Tuck
 
PHP 5.3 and Lithium: the most rad php framework
PHP 5.3 and Lithium: the most rad php frameworkPHP 5.3 and Lithium: the most rad php framework
PHP 5.3 and Lithium: the most rad php frameworkG Woo
 
Crafting beautiful software
Crafting beautiful softwareCrafting beautiful software
Crafting beautiful softwareJorn Oomen
 
Doctrine fixtures
Doctrine fixturesDoctrine fixtures
Doctrine fixturesBill Chang
 
The Zen of Lithium
The Zen of LithiumThe Zen of Lithium
The Zen of LithiumNate Abele
 

What's hot (20)

Min-Maxing Software Costs
Min-Maxing Software CostsMin-Maxing Software Costs
Min-Maxing Software Costs
 
Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design Patterns
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistence
 
PHPSpec - the only Design Tool you need - 4Developers
PHPSpec - the only Design Tool you need - 4DevelopersPHPSpec - the only Design Tool you need - 4Developers
PHPSpec - the only Design Tool you need - 4Developers
 
Command Bus To Awesome Town
Command Bus To Awesome TownCommand Bus To Awesome Town
Command Bus To Awesome Town
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & REST
 
Decoupling the Ulabox.com monolith. From CRUD to DDD
Decoupling the Ulabox.com monolith. From CRUD to DDDDecoupling the Ulabox.com monolith. From CRUD to DDD
Decoupling the Ulabox.com monolith. From CRUD to DDD
 
Rich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 ApplicationRich Model And Layered Architecture in SF2 Application
Rich Model And Layered Architecture in SF2 Application
 
Adding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy ApplicationsAdding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy Applications
 
Forget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers CracowForget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers Cracow
 
November Camp - Spec BDD with PHPSpec 2
November Camp - Spec BDD with PHPSpec 2November Camp - Spec BDD with PHPSpec 2
November Camp - Spec BDD with PHPSpec 2
 
Design how your objects talk through mocking
Design how your objects talk through mockingDesign how your objects talk through mocking
Design how your objects talk through mocking
 
Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015
 
When cqrs meets event sourcing
When cqrs meets event sourcingWhen cqrs meets event sourcing
When cqrs meets event sourcing
 
PHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolvePHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolve
 
Things I Believe Now That I'm Old
Things I Believe Now That I'm OldThings I Believe Now That I'm Old
Things I Believe Now That I'm Old
 
PHP 5.3 and Lithium: the most rad php framework
PHP 5.3 and Lithium: the most rad php frameworkPHP 5.3 and Lithium: the most rad php framework
PHP 5.3 and Lithium: the most rad php framework
 
Crafting beautiful software
Crafting beautiful softwareCrafting beautiful software
Crafting beautiful software
 
Doctrine fixtures
Doctrine fixturesDoctrine fixtures
Doctrine fixtures
 
The Zen of Lithium
The Zen of LithiumThe Zen of Lithium
The Zen of Lithium
 

Viewers also liked

PhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesPhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesMarcello Duarte
 
Emergent design with phpspec
Emergent design with phpspecEmergent design with phpspec
Emergent design with phpspecMarcello Duarte
 
The top 10 things that any pro PHP developer should be doing
The top 10 things that any pro PHP developer should be doingThe top 10 things that any pro PHP developer should be doing
The top 10 things that any pro PHP developer should be doingKacper Gunia
 
Embrace Events and let CRUD die
Embrace Events and let CRUD dieEmbrace Events and let CRUD die
Embrace Events and let CRUD dieKacper Gunia
 
How the Crazy Dutch Are Innovating Music Discovery
How the Crazy Dutch Are Innovating Music DiscoveryHow the Crazy Dutch Are Innovating Music Discovery
How the Crazy Dutch Are Innovating Music DiscoveryErwin Blom
 
Great Places 2020 Maple Crossing Full Strategic Plans
Great Places 2020 Maple Crossing Full Strategic PlansGreat Places 2020 Maple Crossing Full Strategic Plans
Great Places 2020 Maple Crossing Full Strategic PlansKeelee Slack
 
Improve your Java Environment with Docker
Improve your Java Environment with DockerImprove your Java Environment with Docker
Improve your Java Environment with DockerHanoiJUG
 
Royal Dutch Shell plc capital markets day 2016
Royal Dutch Shell plc capital markets day 2016 Royal Dutch Shell plc capital markets day 2016
Royal Dutch Shell plc capital markets day 2016 Shell plc
 
BASICS OF TRANSMISSION SYSTEM
BASICS OF TRANSMISSION SYSTEMBASICS OF TRANSMISSION SYSTEM
BASICS OF TRANSMISSION SYSTEMKartik Paliwal
 
Car Transmission System
Car Transmission SystemCar Transmission System
Car Transmission SystemShubham Thakur
 
The Future of Green Business Strategy
The Future of Green Business StrategyThe Future of Green Business Strategy
The Future of Green Business Strategyfuturethink
 
How to Speak English on the Telephone with Confidence
How to Speak English on the Telephone with ConfidenceHow to Speak English on the Telephone with Confidence
How to Speak English on the Telephone with ConfidenceTJ Taylor Language Training
 
Mobile Investment Outlook 2016 - Edith Yeung
Mobile Investment Outlook 2016  - Edith YeungMobile Investment Outlook 2016  - Edith Yeung
Mobile Investment Outlook 2016 - Edith YeungEdith Yeung
 
Delta Airlines Business Strategy
Delta Airlines Business StrategyDelta Airlines Business Strategy
Delta Airlines Business StrategyAndrew Skurdal
 
Bangalore Container Conference 2017 - Poster
Bangalore Container Conference 2017 - PosterBangalore Container Conference 2017 - Poster
Bangalore Container Conference 2017 - PosterGanesh Samarthyam
 
The best of mobile marketing 2015
The best of mobile marketing 2015The best of mobile marketing 2015
The best of mobile marketing 2015Monika Mikowska
 
Adoption of OER by Educators in Dutch Public Higher Education: A Long and Win...
Adoption of OER by Educators in Dutch Public Higher Education: A Long and Win...Adoption of OER by Educators in Dutch Public Higher Education: A Long and Win...
Adoption of OER by Educators in Dutch Public Higher Education: A Long and Win...Open Education Consortium
 

Viewers also liked (20)

PhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesPhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examples
 
Emergent design with phpspec
Emergent design with phpspecEmergent design with phpspec
Emergent design with phpspec
 
PHPSpec BDD for PHP
PHPSpec BDD for PHPPHPSpec BDD for PHP
PHPSpec BDD for PHP
 
The top 10 things that any pro PHP developer should be doing
The top 10 things that any pro PHP developer should be doingThe top 10 things that any pro PHP developer should be doing
The top 10 things that any pro PHP developer should be doing
 
Embrace Events and let CRUD die
Embrace Events and let CRUD dieEmbrace Events and let CRUD die
Embrace Events and let CRUD die
 
How the Crazy Dutch Are Innovating Music Discovery
How the Crazy Dutch Are Innovating Music DiscoveryHow the Crazy Dutch Are Innovating Music Discovery
How the Crazy Dutch Are Innovating Music Discovery
 
Great Places 2020 Maple Crossing Full Strategic Plans
Great Places 2020 Maple Crossing Full Strategic PlansGreat Places 2020 Maple Crossing Full Strategic Plans
Great Places 2020 Maple Crossing Full Strategic Plans
 
Improve your Java Environment with Docker
Improve your Java Environment with DockerImprove your Java Environment with Docker
Improve your Java Environment with Docker
 
Launching A Management Consulting Practice (2009)
Launching A Management Consulting Practice (2009)Launching A Management Consulting Practice (2009)
Launching A Management Consulting Practice (2009)
 
Royal Dutch Shell plc capital markets day 2016
Royal Dutch Shell plc capital markets day 2016 Royal Dutch Shell plc capital markets day 2016
Royal Dutch Shell plc capital markets day 2016
 
BASICS OF TRANSMISSION SYSTEM
BASICS OF TRANSMISSION SYSTEMBASICS OF TRANSMISSION SYSTEM
BASICS OF TRANSMISSION SYSTEM
 
Car Transmission System
Car Transmission SystemCar Transmission System
Car Transmission System
 
The Future of Green Business Strategy
The Future of Green Business StrategyThe Future of Green Business Strategy
The Future of Green Business Strategy
 
Gear box –industrial applications
Gear box –industrial applicationsGear box –industrial applications
Gear box –industrial applications
 
How to Speak English on the Telephone with Confidence
How to Speak English on the Telephone with ConfidenceHow to Speak English on the Telephone with Confidence
How to Speak English on the Telephone with Confidence
 
Mobile Investment Outlook 2016 - Edith Yeung
Mobile Investment Outlook 2016  - Edith YeungMobile Investment Outlook 2016  - Edith Yeung
Mobile Investment Outlook 2016 - Edith Yeung
 
Delta Airlines Business Strategy
Delta Airlines Business StrategyDelta Airlines Business Strategy
Delta Airlines Business Strategy
 
Bangalore Container Conference 2017 - Poster
Bangalore Container Conference 2017 - PosterBangalore Container Conference 2017 - Poster
Bangalore Container Conference 2017 - Poster
 
The best of mobile marketing 2015
The best of mobile marketing 2015The best of mobile marketing 2015
The best of mobile marketing 2015
 
Adoption of OER by Educators in Dutch Public Higher Education: A Long and Win...
Adoption of OER by Educators in Dutch Public Higher Education: A Long and Win...Adoption of OER by Educators in Dutch Public Higher Education: A Long and Win...
Adoption of OER by Educators in Dutch Public Higher Education: A Long and Win...
 

Similar to Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need

Your code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnConYour code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnConRafael Dohms
 
Tidy Up Your Code
Tidy Up Your CodeTidy Up Your Code
Tidy Up Your CodeAbbas Ali
 
Refactoring using Codeception
Refactoring using CodeceptionRefactoring using Codeception
Refactoring using CodeceptionJeroen van Dijk
 
Dealing with Legacy PHP Applications
Dealing with Legacy PHP ApplicationsDealing with Legacy PHP Applications
Dealing with Legacy PHP ApplicationsClinton Dreisbach
 
Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011
 Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011 Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011
Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011Alessandro Nadalin
 
Introduction to Zend Framework web services
Introduction to Zend Framework web servicesIntroduction to Zend Framework web services
Introduction to Zend Framework web servicesMichelangelo van Dam
 
Moving a high traffic ZF1 Enterprise Application to SF2 - Lessons learned
Moving a high traffic ZF1 Enterprise Application to SF2 - Lessons learnedMoving a high traffic ZF1 Enterprise Application to SF2 - Lessons learned
Moving a high traffic ZF1 Enterprise Application to SF2 - Lessons learnedBaldur Rensch
 
WordPress Realtime - WordCamp São Paulo 2015
WordPress Realtime - WordCamp São Paulo 2015WordPress Realtime - WordCamp São Paulo 2015
WordPress Realtime - WordCamp São Paulo 2015Fernando Daciuk
 
Paying off technical debt with PHPSpec
Paying off technical debt with PHPSpecPaying off technical debt with PHPSpec
Paying off technical debt with PHPSpecLewis Wright
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For BeginnersJonathan Wage
 
Unit testing with zend framework tek11
Unit testing with zend framework tek11Unit testing with zend framework tek11
Unit testing with zend framework tek11Michelangelo van Dam
 
Why is crud a bad idea - focus on real scenarios
Why is crud a bad idea - focus on real scenariosWhy is crud a bad idea - focus on real scenarios
Why is crud a bad idea - focus on real scenariosDivante
 
You code sucks, let's fix it
You code sucks, let's fix itYou code sucks, let's fix it
You code sucks, let's fix itRafael Dohms
 
Unit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxUnit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxMichelangelo van Dam
 
Virtual Madness @ Etsy
Virtual Madness @ EtsyVirtual Madness @ Etsy
Virtual Madness @ EtsyNishan Subedi
 
Unit testing after Zend Framework 1.8
Unit testing after Zend Framework 1.8Unit testing after Zend Framework 1.8
Unit testing after Zend Framework 1.8Michelangelo van Dam
 

Similar to Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need (20)

Your code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnConYour code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnCon
 
Tidy Up Your Code
Tidy Up Your CodeTidy Up Your Code
Tidy Up Your Code
 
Refactoring using Codeception
Refactoring using CodeceptionRefactoring using Codeception
Refactoring using Codeception
 
Dealing with Legacy PHP Applications
Dealing with Legacy PHP ApplicationsDealing with Legacy PHP Applications
Dealing with Legacy PHP Applications
 
Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011
 Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011 Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011
Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011
 
Introduction to Zend Framework web services
Introduction to Zend Framework web servicesIntroduction to Zend Framework web services
Introduction to Zend Framework web services
 
Moving a high traffic ZF1 Enterprise Application to SF2 - Lessons learned
Moving a high traffic ZF1 Enterprise Application to SF2 - Lessons learnedMoving a high traffic ZF1 Enterprise Application to SF2 - Lessons learned
Moving a high traffic ZF1 Enterprise Application to SF2 - Lessons learned
 
WordPress Realtime - WordCamp São Paulo 2015
WordPress Realtime - WordCamp São Paulo 2015WordPress Realtime - WordCamp São Paulo 2015
WordPress Realtime - WordCamp São Paulo 2015
 
Zend framework service
Zend framework serviceZend framework service
Zend framework service
 
Zend framework service
Zend framework serviceZend framework service
Zend framework service
 
Paying off technical debt with PHPSpec
Paying off technical debt with PHPSpecPaying off technical debt with PHPSpec
Paying off technical debt with PHPSpec
 
Unit testing zend framework apps
Unit testing zend framework appsUnit testing zend framework apps
Unit testing zend framework apps
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
 
Unit testing with zend framework tek11
Unit testing with zend framework tek11Unit testing with zend framework tek11
Unit testing with zend framework tek11
 
Hooks WCSD12
Hooks WCSD12Hooks WCSD12
Hooks WCSD12
 
Why is crud a bad idea - focus on real scenarios
Why is crud a bad idea - focus on real scenariosWhy is crud a bad idea - focus on real scenarios
Why is crud a bad idea - focus on real scenarios
 
You code sucks, let's fix it
You code sucks, let's fix itYou code sucks, let's fix it
You code sucks, let's fix it
 
Unit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxUnit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBenelux
 
Virtual Madness @ Etsy
Virtual Madness @ EtsyVirtual Madness @ Etsy
Virtual Madness @ Etsy
 
Unit testing after Zend Framework 1.8
Unit testing after Zend Framework 1.8Unit testing after Zend Framework 1.8
Unit testing after Zend Framework 1.8
 

More from Kacper Gunia

How a large corporation used Domain-Driven Design to replace a loyalty system
How a large corporation used Domain-Driven Design to replace a loyalty systemHow a large corporation used Domain-Driven Design to replace a loyalty system
How a large corporation used Domain-Driven Design to replace a loyalty systemKacper Gunia
 
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learned
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learnedRebuilding Legacy Apps with Domain-Driven Design - Lessons learned
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learnedKacper Gunia
 
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!Kacper Gunia
 
OmniFocus - the #1 ‘Getting Things Done’ tool
OmniFocus - the #1 ‘Getting Things Done’ toolOmniFocus - the #1 ‘Getting Things Done’ tool
OmniFocus - the #1 ‘Getting Things Done’ toolKacper Gunia
 
Scaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Scaling Symfony2 apps with RabbitMQ - Symfony UK MeetupScaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Scaling Symfony2 apps with RabbitMQ - Symfony UK MeetupKacper Gunia
 
Dependency Injection in PHP
Dependency Injection in PHPDependency Injection in PHP
Dependency Injection in PHPKacper Gunia
 

More from Kacper Gunia (8)

How a large corporation used Domain-Driven Design to replace a loyalty system
How a large corporation used Domain-Driven Design to replace a loyalty systemHow a large corporation used Domain-Driven Design to replace a loyalty system
How a large corporation used Domain-Driven Design to replace a loyalty system
 
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learned
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learnedRebuilding Legacy Apps with Domain-Driven Design - Lessons learned
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learned
 
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
 
OmniFocus - the #1 ‘Getting Things Done’ tool
OmniFocus - the #1 ‘Getting Things Done’ toolOmniFocus - the #1 ‘Getting Things Done’ tool
OmniFocus - the #1 ‘Getting Things Done’ tool
 
Scaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Scaling Symfony2 apps with RabbitMQ - Symfony UK MeetupScaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Scaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
 
Dependency Injection in PHP
Dependency Injection in PHPDependency Injection in PHP
Dependency Injection in PHP
 
Code Dojo
Code DojoCode Dojo
Code Dojo
 
SpecBDD in PHP
SpecBDD in PHPSpecBDD in PHP
SpecBDD in PHP
 

Recently uploaded

Energy Awareness training ppt for manufacturing process.pptx
Energy Awareness training ppt for manufacturing process.pptxEnergy Awareness training ppt for manufacturing process.pptx
Energy Awareness training ppt for manufacturing process.pptxsiddharthjain2303
 
Katarzyna Lipka-Sidor - BIM School Course
Katarzyna Lipka-Sidor - BIM School CourseKatarzyna Lipka-Sidor - BIM School Course
Katarzyna Lipka-Sidor - BIM School Coursebim.edu.pl
 
Virtual memory management in Operating System
Virtual memory management in Operating SystemVirtual memory management in Operating System
Virtual memory management in Operating SystemRashmi Bhat
 
complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...asadnawaz62
 
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor CatchersTechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catcherssdickerson1
 
Past, Present and Future of Generative AI
Past, Present and Future of Generative AIPast, Present and Future of Generative AI
Past, Present and Future of Generative AIabhishek36461
 
US Department of Education FAFSA Week of Action
US Department of Education FAFSA Week of ActionUS Department of Education FAFSA Week of Action
US Department of Education FAFSA Week of ActionMebane Rash
 
Main Memory Management in Operating System
Main Memory Management in Operating SystemMain Memory Management in Operating System
Main Memory Management in Operating SystemRashmi Bhat
 
Crushers to screens in aggregate production
Crushers to screens in aggregate productionCrushers to screens in aggregate production
Crushers to screens in aggregate productionChinnuNinan
 
"Exploring the Essential Functions and Design Considerations of Spillways in ...
"Exploring the Essential Functions and Design Considerations of Spillways in ..."Exploring the Essential Functions and Design Considerations of Spillways in ...
"Exploring the Essential Functions and Design Considerations of Spillways in ...Erbil Polytechnic University
 
multiple access in wireless communication
multiple access in wireless communicationmultiple access in wireless communication
multiple access in wireless communicationpanditadesh123
 
Work Experience-Dalton Park.pptxfvvvvvvv
Work Experience-Dalton Park.pptxfvvvvvvvWork Experience-Dalton Park.pptxfvvvvvvv
Work Experience-Dalton Park.pptxfvvvvvvvLewisJB
 
Arduino_CSE ece ppt for working and principal of arduino.ppt
Arduino_CSE ece ppt for working and principal of arduino.pptArduino_CSE ece ppt for working and principal of arduino.ppt
Arduino_CSE ece ppt for working and principal of arduino.pptSAURABHKUMAR892774
 
Risk Management in Engineering Construction Project
Risk Management in Engineering Construction ProjectRisk Management in Engineering Construction Project
Risk Management in Engineering Construction ProjectErbil Polytechnic University
 
welding defects observed during the welding
welding defects observed during the weldingwelding defects observed during the welding
welding defects observed during the weldingMuhammadUzairLiaqat
 
Instrumentation, measurement and control of bio process parameters ( Temperat...
Instrumentation, measurement and control of bio process parameters ( Temperat...Instrumentation, measurement and control of bio process parameters ( Temperat...
Instrumentation, measurement and control of bio process parameters ( Temperat...121011101441
 
Research Methodology for Engineering pdf
Research Methodology for Engineering pdfResearch Methodology for Engineering pdf
Research Methodology for Engineering pdfCaalaaAbdulkerim
 
Comparative study of High-rise Building Using ETABS,SAP200 and SAFE., SAFE an...
Comparative study of High-rise Building Using ETABS,SAP200 and SAFE., SAFE an...Comparative study of High-rise Building Using ETABS,SAP200 and SAFE., SAFE an...
Comparative study of High-rise Building Using ETABS,SAP200 and SAFE., SAFE an...Erbil Polytechnic University
 

Recently uploaded (20)

Energy Awareness training ppt for manufacturing process.pptx
Energy Awareness training ppt for manufacturing process.pptxEnergy Awareness training ppt for manufacturing process.pptx
Energy Awareness training ppt for manufacturing process.pptx
 
Katarzyna Lipka-Sidor - BIM School Course
Katarzyna Lipka-Sidor - BIM School CourseKatarzyna Lipka-Sidor - BIM School Course
Katarzyna Lipka-Sidor - BIM School Course
 
Virtual memory management in Operating System
Virtual memory management in Operating SystemVirtual memory management in Operating System
Virtual memory management in Operating System
 
complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...
 
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor CatchersTechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
 
Past, Present and Future of Generative AI
Past, Present and Future of Generative AIPast, Present and Future of Generative AI
Past, Present and Future of Generative AI
 
US Department of Education FAFSA Week of Action
US Department of Education FAFSA Week of ActionUS Department of Education FAFSA Week of Action
US Department of Education FAFSA Week of Action
 
Main Memory Management in Operating System
Main Memory Management in Operating SystemMain Memory Management in Operating System
Main Memory Management in Operating System
 
Crushers to screens in aggregate production
Crushers to screens in aggregate productionCrushers to screens in aggregate production
Crushers to screens in aggregate production
 
young call girls in Green Park🔝 9953056974 🔝 escort Service
young call girls in Green Park🔝 9953056974 🔝 escort Serviceyoung call girls in Green Park🔝 9953056974 🔝 escort Service
young call girls in Green Park🔝 9953056974 🔝 escort Service
 
"Exploring the Essential Functions and Design Considerations of Spillways in ...
"Exploring the Essential Functions and Design Considerations of Spillways in ..."Exploring the Essential Functions and Design Considerations of Spillways in ...
"Exploring the Essential Functions and Design Considerations of Spillways in ...
 
Design and analysis of solar grass cutter.pdf
Design and analysis of solar grass cutter.pdfDesign and analysis of solar grass cutter.pdf
Design and analysis of solar grass cutter.pdf
 
multiple access in wireless communication
multiple access in wireless communicationmultiple access in wireless communication
multiple access in wireless communication
 
Work Experience-Dalton Park.pptxfvvvvvvv
Work Experience-Dalton Park.pptxfvvvvvvvWork Experience-Dalton Park.pptxfvvvvvvv
Work Experience-Dalton Park.pptxfvvvvvvv
 
Arduino_CSE ece ppt for working and principal of arduino.ppt
Arduino_CSE ece ppt for working and principal of arduino.pptArduino_CSE ece ppt for working and principal of arduino.ppt
Arduino_CSE ece ppt for working and principal of arduino.ppt
 
Risk Management in Engineering Construction Project
Risk Management in Engineering Construction ProjectRisk Management in Engineering Construction Project
Risk Management in Engineering Construction Project
 
welding defects observed during the welding
welding defects observed during the weldingwelding defects observed during the welding
welding defects observed during the welding
 
Instrumentation, measurement and control of bio process parameters ( Temperat...
Instrumentation, measurement and control of bio process parameters ( Temperat...Instrumentation, measurement and control of bio process parameters ( Temperat...
Instrumentation, measurement and control of bio process parameters ( Temperat...
 
Research Methodology for Engineering pdf
Research Methodology for Engineering pdfResearch Methodology for Engineering pdf
Research Methodology for Engineering pdf
 
Comparative study of High-rise Building Using ETABS,SAP200 and SAFE., SAFE an...
Comparative study of High-rise Building Using ETABS,SAP200 and SAFE., SAFE an...Comparative study of High-rise Building Using ETABS,SAP200 and SAFE., SAFE an...
Comparative study of High-rise Building Using ETABS,SAP200 and SAFE., SAFE an...
 

Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need