<p>Değer Nesneleri şunları çözer:</p>

<ul>
    <li>Tür karmaşası (<em>Maaş vs Borç vs İndirim</em>)</li>
    <li>Doğrulama (<em>negatif maaş yok</em>)</li>
    <li>Kullanışlılık (<code>->formatted()</code>, <code>->asFloat()</code>)</li>
    <li>Değişmezlik (<em>yanlışlıkla değişiklik yok</em>)</li>
</ul>

<h2>
    <a name="productionready-monthlyincome-value-object" href="#productionready-monthlyincome-value-object"></a>
    Üretime Hazır Aylık Gelir Değer Nesnesi
</h2>

<p>İşte mükemmel para işlemesi için tam test edilmiş uygulamanız:<br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight php"><code><?php declare(strict_types=1);

namespace App\Identity\Domain\Money;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\DBAL\Types\Types;
use App\Shared\Domain\Primitive;

[ORM\Embeddable]

final class MonthlyIncome extends Primitive
{

  • Hassas para hesaplamaları için sent cinsinden miktar.
  • @var int
    */

    [ORM\Column(name: ‘monthly_income’, type: Types::BIGINT, options: [

    ‘unsigned’ => true,
    ‘default’ => 0
    ])]
    private int $amountInCents;

/ 
 * Miktarı sent cinsinden doğrular ve ayarlar.
 * 
 * @param int $cents
 * @throws \InvalidArgumentException
 */
private function __construct(int $cents)
{
    if ($cents < 0) {
        throw new \InvalidArgumentException(message: 'Miktar negatif olamaz.');
    }

    if ($cents > 999_999_999_99) {
        throw new \InvalidArgumentException(message: 'Miktar çok büyük.');
    }

    $this->amountInCents = $cents;
}

/ 
 * Yüzde biriminden (ana döviz) değer oluşturur.
 * 
 * @param float $value
 * @return self
 */
public static function fromPrincipal(float $value): self
{
    $cents = (int)round($value * 100);
    return new self(cents: $cents);
}

/ 
 * Sent cinsinden doğrudan Aylık Gelir oluşturur.
 * 
 * @param int $value
 * @return self
 */
public static function fromCents(int $value): self
{
    return new self(cents: $value);
}

/ 
 * Ana miktarı float olarak döndürür.
 * 
 * @return float
 */
public function asFloat(): float
{
    return $this->amountInCents / 100.0;
}

/ 
 * Biçimlendirilmiş miktarı döndürür (boşluk/virgül).
 * 
 * @return string
 */
public function formatted(): string
{
    return number_format(
        num: $this->amountInCents(),
        decimals: 2,
        decimal_separator: ',',
        thousands_separator: ' '
    );
}

/ 
 * Aylık Gelir örneklerini karşılaştırır.
 * 
 * @param self $other
 * @return bool
 */
public function equals(self $other): bool
{
    return $this->amountInCents === $other->amountInCents;
}

/ 
 * Hammadde miktarını sent cinsinden döndürür.
 * 
 * @return int
 */
public function amountInCents(): int
{
    return $this->amountInCents;
}

}

<h3>
    <a name="why-this-implementation-is-industrygrade-excellence" href="#why-this-implementation-is-industrygrade-excellence"></a>
    Bu Uygulamanın Neden Endüstri Standartlarında Mükemmel Olduğu?
</h3>

<h4>
    <a name="1-bulletproof-precision" href="#1-bulletproof-precision"></a>
    1. Kurşun Geçirmez Hassasiyet
</h4>

<div class="highlight js-code-highlight">
    <pre class="highlight plaintext"><code>✅ round(num: $value * 100) - doğru bankacı yuvarlaması (kesme değil)

✅ BIGINT UNSIGNED – 999 trilyon dolarlık kapasite
✅ === karşılaştırması – tam bit eşitliği

<h4>
    <a name="2-defensive-programming-masterclass" href="#2-defensive-programming-masterclass"></a>
    2. Savunma Programlaması Ustaları
</h4>

<div class="highlight js-code-highlight">
    <pre class="highlight plaintext"><code>✅ Özel yapıcı - geçersiz durumlar imkansız

✅ Negatif miktar doğrulaması
✅ Taşma koruması (999T maksimum)
✅ strict_types=1 + adlandırılmış argümanlar

<h4>
    <a name="3-perfectly-named-api" href="#3-perfectly-named-api"></a>
    3. Mükemmel İsimlendirilmiş API
</h4>

<div class="highlight js-code-highlight">
    <pre class="highlight plaintext"><code>fromPrincipal(75000.25) → "formdan maaş"

fromCents(7500025) → “veritabanından maaş”
asFloat() → “API JSON”
formatted() → “kullanıcı görüntüsü”

<h2>
    <a name="conclusion-the-definitive-money-solution" href="#conclusion-the-definitive-money-solution"></a>
    Sonuç: Kesin Para Çözümü
</h2>

<p><code>MonthlyIncome</code> Değer Nesnesi, her türlü PHP float hassasiyeti sorununu kalıcı olarak ortadan kaldırır.</p>

<p><strong>1. Mükemmel Hassasiyet</strong><br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight plaintext"><code>0.1 + 0.2 → 0.3 tam olarak

123.999 → 124.00 (uygun yuvarlama)
Float → cents → float: %100 geri dönüş tam

<p><strong>2. Üretim Mükemmelliği</strong></p>

<ul>
    <li>BIGINT UNSIGNED (999 trilyon $ kapasite)</li>
    <li>Özel yapıcı doğrulaması</li>
    <li>Değişmez son sınıf</li>
    <li>Doctrine Embeddable hazır</li>
    <li>strict_types=1 güvenliği</li>
</ul>

<p><strong>3. Kristal Berraklığında API</strong><br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight plaintext"><code>fromPrincipal(75000.25) → Formdan alanı

formatted() → “75 000,25” kullanıcı görüntüsü
asFloat() → JSON API’ları
equals() → İşletme karşılaştırmaları

<p><strong>4. Gerçek Etki</strong><br/></p>

<div class="highlight js-code-highlight">
    <pre class="highlight plaintext"><code>1M işlem:

Float yöntemi: 2,347 sent kaybedildi + başarısız denetimler
MonthlyIncome: 0 sent kaybı + mükemmel muhasebe

<p>Her işlemde kaybedilen bir kopek iflas anlamına gelir. Bu çözüm milyarlara ölçeklenir.</p>

Kaynak: Orijinal Makale

Bu Makaleyi Paylaş