Apakah seni bina modular? Mari kita lihat contoh yang bukannya, dan
kami akan berusaha untuk mengubahnya. Pada akhirnya anda mungkin yakin dengan
nya
merit atau itu satu pembaziran masa yang besar.
Ini adalah senario sebenar yang saya fikirkan berkembang di tempat kerja. Nama dan butiran
tanpa nama, tetapi contoh dunia sebenar bagi konsep biasa sepatutnya menyeronokkan untuk berjalan
melalui, jika tiada yang lain.
Tapak kami mempunyai butang yang tinggal dalam pengepala tapak. Ia memaparkan bilangan
V-Bucks pengguna telah meninggalkannya, tetapi juga mempunyai beberapa logik perniagaan yang dimasukkan ke dalamnya:
Dan seterusnya. Terdapat banyak kes sedemikian, pengurus produk dan pengurus projek kami
dan pengurus reka bentuk dan Pengarah Kumpulan V-Bucks telah mengimpikan bahawa kami perlu
pegang.
Jimbo pelatih telah ditugaskan untuk melaksanakan ini kerana ia hanya
butang!
Dia meneliti lima belas lelaran bercanggah reka bentuk Figma. Dia dapati
keperluan dalam seberapa banyak dokumen Word yang berasingan kerana terdapat PM. Dia mengatur dan
menjalani tujuh sesi pemindahan pengetahuan dengan tujuh pasukan untuk mendedahkan
pengetahuan purba, proprietari tentang perkhidmatan yang akan menyediakan data yang dia perlukan
untuk jenis pengguna dan kiraan V-Bucks. Pasukan kandungan telah meyakinkannya bahawa
versi akhir semua rentetan akan diluluskan oleh undang-undang dan pemasaran pada akhir
minggu ini, dan dengan itu, dia bersedia untuk membina butang ini.
Berikut ialah lelaran pertama butang V-Bucks, popover dan berkaitan
logik perniagaan.
Jimbo berpuas hati dengan struktur direktori ringkas yang dia hasilkan:
/v-bucks-button ├── button.tsx ├── index.ts └── /v-bucks-popover │ ├── popover.tsx
Jadi dia mula membina butang ini, dan butang itu bermula dengan tidak bersalah.
export const VBucksButton: React.FC<VBBProps> = ({ ... }) => { // Set up state const authConfig = { ... } const { user } = useAuth({ ...authConfig }) const { vBucks } = useGetVBucks({ user }) const { telemetry } = useTelemetry() const { t } = useTranslation('vBucksButton.content') const styles = useButtonStyles() // Derive some state via business logic const handleClick = () => { ... } const buttonText = vBucks === ERROR ? '--' : vBucks.toString(); // About 25 more lines of various button state, error handling, // conditional rendering, with comments throughout explaining // why we're showing or hiding something or other const popoverProps = { // About 200 lines of typical popover handling, // telemetry, business logic, content to display, etc } const tooltipProps = { // Another 100 lines of the same for tooltip } return ( <VBucksPopover {...popoverProps} trigger={ <Tooltip {...tooltipProps}> <button ariaLabel={t('ariaLabel')} className={` about seven-hundred classnames for responsive design, accessibility, conditional premium styles, et cetera`} onClick={handleClick}> {buttonText} </button> </Tooltip> } /> ) } <p>Dia telah melaksanakan langkah pertama padanya. VBucksPopover mempunyai kompleks<br> yang serupa logik perniagaan, pengendalian ralat, pengurusan negeri, penggayaan dan komen yang memberi alasan<br> hutang teknologi atas nama penghantaran.</p> <p>Di bawah 400 baris sahaja, butang ini sangat mudah. Walaupun popover adalah<br> lagi 500 baris spageti. Adakah benar-benar "membersihkannya" atau membelahnya<br> memberi manfaat kepada kami, atau pengguna kami, dalam apa cara sekalipun? Ia bergantung. Jika ini sahaja yang kita perlukan untuk<br> butang ini, siapa peduli. Jom teruskan!</p> <p>Tetapi dua bulan telah berlalu dan seorang PM dan pereka dari pasukan produk lain menyukai<br> butang anda dan mahukannya dalam pengepala apl mereka. Mereka mempunyai senarai <em>mudah</em>, tidak<br> tekanan daripada penghujung mereka, beberapa perubahan yang mereka mahu anda terima dan jika<br> anda boleh tolong berikan ETA pada penghujung hari untuk LT yang bagus, terima kasih:</p> <ul> <li>Kemas kini gaya butang dan teks paparan berdasarkan apl yang ditunjukkan dalam</li> <li>Tunjukkan set popover yang berbeza sama sekali, setiap apl</li> <li>Buka mod upsell standard di seluruh syarikat baharu apabila pengguna kehabisan V-Bucks, tetapi hanya di beberapa wilayah, dan hanya kepada pengguna berumur 16 tahun, dan hanya jika mereka berada di dalamnya kumpulan percubaan A</li> </ul> <p>Bolehkah Jimbo memasukkan semua fungsi baharu ini ke dalam komponen yang sama?<br><br> ya. Adakah pemisahan atau pemfaktoran semula memberi manfaat kepada pengguna atau menarik perhatian pengurus anda?<br><br> Tidak. Tetapi pemfaktoran semula mempunyai beberapa hujah yang kukuh pada tahap kerumitan ini:</p> <ul> <li>Kewarasan dev</li> <li>Kewarasan dev yang menggantikan Jimbo apabila dia PIP kerana tidak memfaktorkan semula</li> <li>Lebih banyak wakil, jadi anda melakukan yang lebih baik dari mula pada kali seterusnya</li> <li>Sesuatu untuk diblog nanti</li> </ul> <h3> Pendekatan seni bina modular </h3> <p>Akhlak Kod Bersih bermula, dan jenis dubur lain yang cukup tahu untuk<br> jawab pada Stack Overflow dengan kerap, malah datuk dan nenek anda, lihat sesuatu<br> seperti ini:</p> <ul> <li>KISS, KERING & selimut akronim lain</li> <li>Pengasingan kebimbangan</li> <li>Atomicity! Menyahganding! Onomatopoeia!</li> </ul> <p>Ini bagus, dan membantu memaklumkan percubaan Jimbo yang seterusnya. Dia tidak mendapat PIP selepas<br> semua, dan sebenarnya mendapat promo untuk penghantaran lebih awal daripada jadual dan untuk perkongsian<br> begitu banyak mesyuarat dan dokumen.<br><br> Tetapi dia lebih bijak sekarang dan belajar cara yang bagus untuk melaksanakan pepatah itu. Nampaknya<br> sesuatu seperti ini:<br> </p> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">/v-bucks-button ├── button.tsx ├── index.ts └── /v-bucks-popover │ ├── popover.tsx
Kelihatan banyak plat dandang untuk butang dan popover. Mengapa ini
lebih baik?
Ia bergantung. Berikut ialah gambaran ringkas Jimbo dengan rasional:
Ia boleh berskala tak terhingga! Blok bangunan ini tidak dipecahkan oleh
peraturan sewenang-wenangnya seperti baris kod atau "kerumitan". Mereka dipecahkan oleh
tujuan: setiap sempadan konsep mempunyai satu tujuan.
Seorang PM mahu anda membuat 10 popover baharu? Tiada masalah -- seni bina Jimbo boleh
uruskannya.
Kepimpinan mahukan metrik jualan yang lebih baik dalam sesetengah apl, tetapi pasukan lain tidak
mempunyai pembiayaan untuk membina telemetri untuk menyokong ini. Hebat! Kami ada
telemetri utils yang kita boleh skala mendatar untuk memenuhi pelbagai, berubah
keperluan.
Reka bentuk semula yang menyeluruh bermakna setiap popover perlu memaparkan bahan yang berbeza,
berdasarkan syarat yang berbeza. Ia biasanya jauh lebih mudah sekarang kerana semua
bahan yang kami berikan, dan semua logik yang kami gunakan untuk menjadikannya, wujud dalam yang jelas
blok. Mereka tidak lagi bercampur dalam timbunan konflik dan logik yang besar
rantai sepanjang 20 baris.
Berikut ialah contoh bekas / corak pemapar ini:
/v-bucks-button ├── button.tsx ├── index.ts └── /v-bucks-popover │ ├── popover.tsx
export const VBucksButton: React.FC<VBBProps> = ({ ... }) => { // Set up state const authConfig = { ... } const { user } = useAuth({ ...authConfig }) const { vBucks } = useGetVBucks({ user }) const { telemetry } = useTelemetry() const { t } = useTranslation('vBucksButton.content') const styles = useButtonStyles() // Derive some state via business logic const handleClick = () => { ... } const buttonText = vBucks === ERROR ? '--' : vBucks.toString(); // About 25 more lines of various button state, error handling, // conditional rendering, with comments throughout explaining // why we're showing or hiding something or other const popoverProps = { // About 200 lines of typical popover handling, // telemetry, business logic, content to display, etc } const tooltipProps = { // Another 100 lines of the same for tooltip } return ( <VBucksPopover {...popoverProps} trigger={ <Tooltip {...tooltipProps}> <button ariaLabel={t('ariaLabel')} className={` about seven-hundred classnames for responsive design, accessibility, conditional premium styles, et cetera`} onClick={handleClick}> {buttonText} </button> </Tooltip> } /> ) }
/vBucksButton ├── /hooks │ ├── index.ts │ └── useButtonState.hook.ts ├── /vBucksPopover │ ├── /app1Popover │ │ ├── /hooks │ │ │ ├── index.ts │ │ │ └── usePopoverState.hook.ts │ │ ├── ... │ ├── /app2Popover │ ├── index.ts │ ├── popover.renderer.tsx │ ├── popover.styles.ts │ ├── popover.tsx │ └── popover.types.ts ├── /utils │ ├── experimentation.util.ts │ ├── store.util.ts │ ├── telemetry.util.ts │ └── vBucks.businessLogic.util.ts ├── button.renderer.tsx ├── button.styles.ts ├── button.tsx ├── button.types.ts └── index.ts
Ketepikan: Dokumen TailwindCSS secara jelas mengesyorkan agar tidak menggunakan @apply untuk mengekstrak kelas biasa seperti ini. Ini menyebabkan perbezaan hampir sifar dalam saiz berkas, dan tiada perbezaan lain selain daripada "anda perlu menghasilkan nama kelas." CSS gred pengeluaran hampir selalu berakhir dengan berpuluh-puluh baris panjang, didarab dengan walau bagaimanapun banyak elemen memerlukan penggayaan dalam komponen tertentu. Pertukaran ini nampaknya berbaloi 90% pada setiap masa.
Dan selebihnya logik perniagaan sedia ada dan baharu, kekal dalam mata kail & kegunaan!
Seni bina baharu ini memuaskan hati peminat dan menjadikan perkara lebih mudah untuk skala atau
padam atau gerakkan.
Menulis ujian unit menjadi kurang menyakitkan kerana anda mempunyai
yang jelas
sempadan. Penyampai anda tidak perlu lagi mengejek sepuluh perkhidmatan yang berbeza untuk
sahkan bahawa ia menunjukkan beberapa set kilauan yang diberikan beberapa input. Mata kail anda boleh
menguji, secara berasingan, bahawa ia sepadan dengan logik perniagaan yang anda inginkan.
Adakah seluruh lapisan keadaan anda baru sahaja berubah? Sungguh memalukan jika kod dalam
anda
cangkuk telah digabungkan dengan kod yang menggunakannya, tetapi kini ia lebih ringkas
tukar dan pemapar anda masih hanya mengharapkan input.
Seni bina modular ini menambahkan banyak boilerplate dan akhirnya boleh memberikan
faedah sifar.
Saya tidak boleh mengesyorkannya secara praktikal jika anda sedang mengusahakan projek semangat atau
utamakan penghantaran & memberikan nilai di atas segalanya. Jika anda mempunyai sesuatu yang
nampaknya skop ini mungkin berkembang dari semasa ke semasa atau anda mungkin mahu
baik pulih sepenuhnya selepas POC, ia boleh mengurangkan hutang teknologi... kadangkala.
Anda boleh menggunakan alatan seperti Plop untuk menjana boilerplate ini.
Jadi, apakah yang saya pelajari daripada karya Jimbo & seni bina modular?
Kod Bersih dan akronim yang kami pelajari di sekolah dan Well Ackshuallys dunia
adalah satu hujung spektrum. Menggodam bersama kod spageti berfungsi adalah satu lagi
berakhir, dan selalunya berfungsi dengan baik, kerana akhirnya semua kod adalah hutang teknologi.
Penyelesaian terbaik wujud dalam beberapa keadaan kuantum atau gabungan hujung ini, dan
jalan yang kita pilih mungkin akan diputuskan berdasarkan:
Atas ialah kandungan terperinci Seni bina Modular React. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!