Code review niyə var?
Code review kodu bəyənmək və ya ələ salmaq üçün deyil. Məqsəd üçdür: səhvi istifadəçiyə çatmadan tutmaq, komandanın kodu eyni cür başa düşməsini təmin etmək və bilik paylaşmaq. Yaxşı review şərhi konkretdir (hansı sətir), səbəbi izah edir (nə risk var) və çıxış yolu təklif edir. "Bu pisdir" şərhi yox, "bu sətir 0 miqdarını qəbul edir, @Positive əlavə edək" şərhi faydalıdır. Şərhin blocking (merge-dən əvvəl düzəlməlidir) yoxsa nit (zövq məsələsi) olduğunu da açıq yazmaq lazımdır. Daha ətraflı: code review mədəniyyəti.
Qatlar: controller, service, repository
- Controller HTTP dilini tərcümə edir: request-i oxuyur, servisi çağırır, düzgün status və body qaytarır. Biznes qaydası burada yaşamır.
- Service biznes qaydalarını və transaction sərhədlərini saxlayır (qiymət, endirim, stok yoxlaması).
- Repository yalnız məlumatın saxlanması və oxunmasıdır.
Qaydanı Controller-də yazsanız, onu başqa yerdən (job, message consumer) təkrar istifadə edə bilməzsiniz və test üçün HTTP qatını qaldırmalı olursunuz. Ətraflı: Spring Boot layering.
Girişi sərhəddə yoxlayın
Client-dən gələn hər şey etibarsızdır. Typed request DTO yazın və Bean Validation constraint-ləri əlavə edin; controller parametrində @Valid olsun. Yoxlama uğursuz olarsa Spring MethodArgumentNotValidException atır və siz onu @RestControllerAdvice ilə 400 Bad Request cavabına çevirirsiniz. Cavabın formatı üçün RFC 9457 (Problem Details) standartı var: Spring 6 bunun üçün ProblemDetail sinfini verir, client isə həmişə eyni strukturda xəta alır. Ətraflı: validation və xətalar.
Düzgün HTTP status
Yeni resurs yaradılanda 201 Created qaytarın və Location header-də yeni resursun ünvanını göstərin. 200 OK "nəsə oldu" deməkdir, 201 isə "yeni resurs yarandı və budur ünvanı" deməkdir. Xəta olanda isə heç vaxt 200 və boş body qaytarmayın.
Entity-ni xaricə çıxarmayın
JPA entity verilənlər bazası modelidir. Onu API cavabı etsəniz, daxili sahələr (məsələn, daxili statuslar) sızır, cədvəl dəyişəndə API sınır, lazy əlaqələr isə gözlənilməz sorğular və ya serializasiya xətaları yaradır. Ayrıca response DTO yazın: API müqaviləsi bazadan asılı olmasın.
Adlandırma
q, p, o yazan müəllif bu gün başa düşür, 3 aydan sonra isə heç kim. quantity, product, order və OrderStatus.NEW kodu şərhsiz oxunaqlı edir. 10 və 0.9 kimi "magic number"-lar adlandırılmış sabit olmalıdır ki, qaydanın nə olduğu aydın görünsün.
Qısa nümunə
@PostMappingpublic ResponseEntity<OrderResponse> create(@Valid @RequestBody CreateOrderRequest request) { OrderResponse created = orderService.create(request); URI location = URI.create("/orders/" + created.id()); return ResponseEntity.created(location).body(created);}Controller nazik qalır: validasiya annotasiyada, qayda servisdədir, status və header isə burada təyin olunur.