Cohesion ve coupling iyi tasarlanmış sistemler oluşturmak için kritik rol oynamaktadır.

Cohesion

Bir sınıfın içerisindeki öğelerin birbiri ile ne kadar ilişkili olduğu anlamına gelir. Sınıf içindeki variable ve methodların bir arada, tek bir sorunu çözmek için aralarındaki bağ ne kadar kuvvetliyse, aralarındaki cohesion seviyesi de o kadar yüksek anlamına gelir.

Coupling

Bir sınıfın başka bir sınıfa ne kadar bağımlı olduğunu belirler. Genel tasarım açısından düşük coupling her zaman daha esnek ve sürdürülebilir bir yapı sağlar.

İki modülün birbiriyle yüksek couplinge sahip olması, bu iki modülün değiştirilmesi durumunda birbirini etkileyebileceği anlamına gelmektedir. Yeni feature ekleme, var olan feature üzerinde değişiklik yapılması, bug fix gibi durumlarda değişiklik yapmayı zorlamaktadır. Bir sınıf üzerinde yapılan değişiklikle, diğer sınıfın işini bozabilirsiniz.

PHP Example

Implementation

<?php
namespace App\\Interfaces;

interface UserInfoProvider
{
	public function getUserName(): string;
	public function getUserEmail(): string;
}
<?php
namespace App\\Models;

use Illuminate\\Foundation\\Auth\\User as Authenticatable;
use App\\Interfaces\\UserInfoProvider;

class User extends Authenticatable implements UserInfoProvider
{
    public function getUserName(): string
    {
        return $this->name;
    }

    public function getUserEmail(): string
    {
        return $this->email;
    }
}
<?php

namespace App\\Models;

use App\\Interfaces\\UserInfoProvider;

class Order
{
    protected $userInfoProvider;

    public function __construct(UserInfoProvider $userInfoProvider)
    {
        $this->userInfoProvider = $userInfoProvider;
    }

    public function createOrder()
    {
        $userName = $this->userInfoProvider->getUserName();
        $userEmail = $this->userInfoProvider->getUserEmail();

        return "Sipariş oluşturuldu! Müşteri: {$userName}, E-posta: {$userEmail}";
    }
}

Usage

<?php

namespace App\\Http\\Controllers;

use App\\Models\\Order;
use App\\Models\\User;

class OrderController extends Controller
{
    public function createOrder($userId)
    {
        // User sınıfını oluştur
        $user = User::findOrFail($userId);

        // Order sınıfını oluştur ve kullanıcı bilgilerini argument olarak geç.
        $order = new Order($user);

        // Sipariş oluştur ve sonucu döndür
        $result = $order->createOrder();

        return response()->json(['message' => $result]);
    }
}