D
Engineering

Konvensi Kode

Pola dominan yang ada di codebase vs anti-pola yang muncul akibat tidak adanya standar. Ikuti yang dominan kecuali ada alasan kuat.

Codebase dazoapp dikerjakan turun-temurun tanpa standar koding dan tanpa code review. Pola yang ada bukan keputusan desain — jangan ditiru secara otomatis. Tapi yang dominan aman diikuti.

Backend

AspekPola dominanPemakaian
Response APIresponse()->json()1.028 hit
Response halamanInertia::render()124 hit
Ambil userauth()->user()416 hit
(hindari)Auth::user()33 hit
Business logicMayoritas di controller9 service tidak konsisten dipakai
Helper globalapp/Helpers/helpers.phpautoload via composer.json "files"

Response API

php
// BENAR — pola dominan
return response()->json([
    'status'  => true,
    'data'    => $order,
    'message' => 'Order created',
], 201);

// BENAR — untuk halaman
return Inertia::render('Order/Show', [
    'order' => $order,
]);

Untuk fitur baru — tulis di service

Controller sudah bengkak (OrderController.php 2.987 baris, ContactController.php 2.403, ProductController.php 2.017). Tulis logic baru di app/Services/, bukan di controller.

Ada 9 service yang sudah ada:

ServiceBarisFungsi
DigitalStoreService.php1.750Digital store + checkout
WalletService.php352Wallet, balance, transaksi
RegistrationLinkService.php559Registration link + tracking
DokuApiService.php290DOKU API wrapper
DigitalProductService.php269Pengiriman produk digital
AuthService.php217Auth + OTP
GeoIPService.php313Geolokasi IP
DeviceService.php31Helper device
TurnstileService.php19Cloudflare Turnstile

Frontend

AspekPola dominanPemakaian
Vue API<script setup>144 dari 234 halaman
Form/navigasiInertia useForm86 file
API call luar Inertiaaxios langsung42 file
(sebaiknya)services/axiosInstance.js1 file
StatePinia (sidebarStore.js)
(legacy)Vuex4 file (theme customizer)
Alias@/resources/jslihat vite.config.js

Untuk kode Vue baru

vue
<script setup>
import { useForm } from '@inertiajs/vue3'
import { Head, Link } from '@inertiajs/vue3'

const form = useForm({
    name: '',
    email: '',
})

const submit = () => form.post('/api/contact', {
    preserveScroll: true,
})
</script>

<template>
    <form @submit.prevent="submit">
        <!-- ... -->
    </form>
</template>

API call di luar Inertia

Pakai services/axiosInstance.js — sudah menangani JWT + refresh otomatis:

js
import axiosInstance from '@/services/axiosInstance'

const { data } = await axiosInstance.get('/api/orders')

Penamaan

Campur aduk — ini kondisi nyata, bukan standar yang harus ditiru:

GayaContohLokasi
PascalCaseComponents/, Modal.vueKomponen (dominan)
kebab-casenav-bar.vue, nav-bar-livechat.vueLayout (warisan)
camelCasefollowupLiveChat.vueSebagian Pages

Typo yang terlanjur dipakai

Jangan perbaiki tanpa diminta — akan memecah import:

  • Toltip.vue (harusnya Tooltip)
  • AccordionGrup.vue (harusnya AccordionGroup)
  • ContentSyarat&Ketentuan.vue — ada & di nama file

Untuk file baru

  • Komponen: PascalCase.vue
  • Util: camelCase.js
  • Halaman: PascalCase.vue

Bahasa

Komentar, variabel, dan commit bercampur Indonesia/Inggris.

  • Balas user dalam Bahasa Indonesia
  • Untuk kode, ikuti bahasa file yang sedang diedit
  • Jangan mengganti bahasa komentar yang sudah ada

God component — hati-hati

BarisFile
9.668resources/js/Pages/Order/Main.vue
5.681resources/js/Pages/LiveChat/Index.vue
4.692resources/js/Pages/Product/CreateEdit.vue
4.438resources/js/Pages/DigitalStore/Index.vue
4.367resources/js/Pages/DigitalStore/StorePreview.vue

Komponen kembar — cek dulu sebelum buat

Pola duplikasi yang ada:

JenisVarian yang ada
ModalModal, ModalComponent, ModalDefault, AlertModal, ConfirmsModal, ConfirmsModalBot
LoaderLoader, Loading, ContentLoader, ContentLoading, Shimmer, NavbarLoading, SidebarLoading
Navbarnav-bar, nav-bar-livechat, nav-bar-welcome, navbar-welcome (perhatikan dua penamaan berbeda)
Input teksInput, TextInput, BaseInput
Number inputNumberInput, NumberInputV2

Duplikasi dari tidak adanya review

JenisContoh
Library chart4: apexcharts, chart.js, echarts, amcharts5
Editor3: ckeditor5 + varian, quill
Carousel4: swiper, hooper, vue3-carousel, vueperslides
Avatar3: @lossendae/vue-avatar, vue-avatar, vue3-avatar
Date/time3: date-fns, moment, Intl manual

Saat menambah library, cek dulu apakah sudah ada yang serupa. Jangan tambah varian ke-5.

Helper tumpang tindih

Ada tiga modul helper dengan duplikasi:

ModulBarisIsi
state/helpers.js602Format tanggal, currency, URL, SweetAlert, guard pesan WA
global.js147URL service + format (gitignored, lihat Environment)
utils/127markdown.js, normalizationText.js

Duplikat: formatDateOnly, getPageCardWidth ada di helpers.js dan global.js. timeAgo (global) vs getTimeAgoString (helpers) melakukan hal yang sama.

Langkah berikutnya