You don’t need an Application service class either! Let’s check the definition made by the author of the concept: When a significant process or transformation in the domain is not a natural responsibility of an ENTITY or VALUE OBJECT, add an operation to the model as standalone interface declared as a SERVICE. Define the interface in terms of the language of the model and make sure the operation name is part of the UBIQUITOUS LANGUAGE. Make the SERVICE stateless. Domain-Driven Design Eric Evans, Service class is procedural In plain English it means that it’t nothing more then a procedure. Why? Because you take an object, operate upon its data and pass it to another object. It contradicts to , where data and behavior reside together. So in my object world everything is some object’s responsibility.Typical example of procedural code that involves a domain service is . basic principles of OOP password hashing Use decorators instead Every time you need some new behavior, you should consider using a . So that’s how the example above can be re-written: decorator pattern { ( HashedPassword( RegexMatchedPassword( NonEmptyPassword( Password( )), Regex( ))))->string();} (Exception $exception) { $exception->getMessage();} try echo new new new new 'asdSd12@A1' new '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,10}$/' catch echo All attention to ‘HashedPassword’ class. All hashing functionality resides there. I like this name — hashed password. It’s very declarative, unlike “hash password”, which is more like “how”, than “what”, thus being inherently imperative. Besides moving domain service’s functionality to , I employed , the concept introduced by Yegor Bugayenko. DDD’s value object validation decorators So here is the rest of the code: IPassword{ string();} interface public function Password IPassword{ ; class implements private $password **public function** \_\_construct($password) { $this->**password** \= $password; } **public function** string() { **return** $this->**password**; } } NonEmptyPassword IPassword{ ; class implements private $password **public function** \_\_construct(IPassword $password) { $this->**password** \= $password; } **public function** string() { **if** (_is\_null_($this->**password**\->string())) { **throw new** Exception(**'Password can not be empty'**); } **return** $this->**password**\->string(); } } RegexMatchedPassword IPassword{ ; ; class implements private $password private $regex **public function** \_\_construct(IPassword $password, IRegex $regex) { $this->**password** \= $password; $this->**regex** \= $regex; } **public function** string() { _// https://stackoverflow.com/a/21456918/618020_ **if** (!_preg\_match_($this->**regex**\->value(), $this->**password**\->string())) { **throw new** Exception( **'Password must have minimum eight and maximum 10 characters, at least one uppercase letter, one lowercase letter, one number and one special character.'** ); } **return** $this->**password**\->string(); } } IRegex{ value();} interface public function Regex IRegex{ ; class implements private $regex **public function** \_\_construct($regex) { $this->**regex** \= $regex; } **public function** value() { **if** (_preg\_match_($this->**regex**, **null**) === **false**) { **throw new** Exception(**'Your regex is broken.'**); } **return** $this->**regex**; } } HashedPassword IPassword{ ; class implements private $password **public function** \_\_construct(IPassword $password) { $this->**password** \= $password; } **public function** string() { **return** _sha1_($this->**password**\->string()); } } So if objects are designed properly, there are no services. There are just normal objects, representing the real things. So following this heuristics, I claim that Application services are a mistake too. Stay tuned.