Skip to content

Commit

Permalink
docs: fa/naming-conventions.mdx and fa/testing.mdx (#4179)
Browse files Browse the repository at this point in the history
  • Loading branch information
mbfakourii authored May 29, 2024
1 parent 1346cca commit b68ce3c
Show file tree
Hide file tree
Showing 3 changed files with 150 additions and 4 deletions.
82 changes: 82 additions & 0 deletions docs/src/content/docs/fa/naming-conventions.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
---
title: قراردادهای نامگذاری
description: مروری بر قوانین نامگذاری توصیه شده هنگام استفاده از بلوک.
---

import EventExamplesGood1 from '~/components/naming-conventions/EventExamplesGood1Snippet.astro';
import EventExamplesBad1 from '~/components/naming-conventions/EventExamplesBad1Snippet.astro';
import StateExamplesGood1Snippet from '~/components/naming-conventions/StateExamplesGood1Snippet.astro';
import SingleStateExamplesGood1Snippet from '~/components/naming-conventions/SingleStateExamplesGood1Snippet.astro';
import StateExamplesBad1Snippet from '~/components/naming-conventions/StateExamplesBad1Snippet.astro';

قراردادهای نامگذاری زیر صرفاً توصیه شده و کاملاً اختیاری هستند. با خیال راحت از هر گونه قرارداد نامگذاری که ترجیح می دهید استفاده کنید. ممکن است دریابید که برخی از مثال‌ها/اسناد اصولاً به دلیل سادگی/مختصر بودن از قراردادهای نام‌گذاری پیروی نمی‌کنند. این قرارداد ها به شدت برای پروژه های بزرگ با توسعه دهندگان متعدد توصیه می شود.

## قراردادهای کلاس رویداد

رویدادها باید با **گذشته ساده** نامگذاری شوند، زیرا رویدادها چیزهایی هستند که از دیدگاه Bloc قبلاً اتفاق افتاده اند.

### ساختار

`BlocSubject` + `Noun (optional)` + `Verb (event)`

رویدادهای لود اولیه باید این قرارداد را دنبال کنند: `BlocSubject` + `Started`

:::note
کلاس های رویداد پایه باید این نامگذاری را داشته باشند: `BlocSubject` + `Event`.
:::

### مثال ها

**خوب**

<EventExamplesGood1 />

**بد**

<EventExamplesBad1 />

## قراردادهای کلاس وضعیت

وضعیت‌ها باید اسم باشند، چرا که یک وضعیت فقط یک لحظه‌ی خاص در زمان را نمایان می‌کند. دو روش رایج برای نمایش وضعیت وجود دارد: استفاده از زیرکلاس‌ها (Subclasses) یا استفاده از یک کلاس تکی (Single class).

### ساختار

#### زیرکلاس‌ها

`BlocSubject` + `Verb (action)` + `State`

هنگام نمایش وضعیت به عنوان چندین زیرکلاس، `State` باید یکی از موارد زیر را دارا باشد:

`Initial` | `Success` | `Failure` | `InProgress`

:::note
وضعیت‌های اولیه باید طبق این قرار داد عمل کنند: `BlocSubject` + `Initial`.
:::

#### کلاس تکی

`BlocSubject` + `State`

هنگام نمایش وضعیت به عنوان یک کلاس پایه تکی، باید از یک enum با نام `BlocSubject` + `Status` برای نمایش وضعیت‌های مختلف استفاده شود:

`initial` | `success` | `failure` | `loading`.

:::note
کلاس وضعیت پایه همیشه باید به این روش نام گذاری شوند: `BlocSubject` + `State`.
:::

### مثال ها

**خوب**

##### زیرکلاس‌ها

<StateExamplesGood1Snippet />

##### کلاس تکی

<SingleStateExamplesGood1Snippet />

**بد**

<StateExamplesBad1Snippet />
64 changes: 64 additions & 0 deletions docs/src/content/docs/fa/testing.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
---
title: آزمایش کردن (Testing)
description: اصول اولیه نحوه نوشتن تست برای بلوک های خود.
---

import CounterBlocSnippet from '~/components/testing/CounterBlocSnippet.astro';
import AddDevDependenciesSnippet from '~/components/testing/AddDevDependenciesSnippet.astro';
import CounterBlocTestImportsSnippet from '~/components/testing/CounterBlocTestImportsSnippet.astro';
import CounterBlocTestMainSnippet from '~/components/testing/CounterBlocTestMainSnippet.astro';
import CounterBlocTestSetupSnippet from '~/components/testing/CounterBlocTestSetupSnippet.astro';
import CounterBlocTestInitialStateSnippet from '~/components/testing/CounterBlocTestInitialStateSnippet.astro';
import CounterBlocTestBlocTestSnippet from '~/components/testing/CounterBlocTestBlocTestSnippet.astro';

Bloc به گونه ای طراحی شده است که آزمایش آن بسیار آسان باشد.در این بخش، نحوه تست واحد (Unit Test) یک بلوک را توضیح خواهیم داد.

به خاطر سادگی، بیایید تست ها را برای `CounterBloc` که در [مفاهیم اصلی](/fa/bloc-concepts) ایجاد کردیم بنویسیم.

برای خلاصه‌ی مطلب، پیاده‌سازی `CounterBloc` به شکل زیر است:

<CounterBlocSnippet />

## راه اندازی (Setup)

قبل از شروع نوشتن تست های خود، باید یک چارچوب آزمایشی (Testing Framework) را به وابستگی های خود اضافه کنیم.

ما باید [test](https://pub.dev/packages/test) و [bloc_test](https://pub.dev/packages/bloc_test) را به پروژه خود اضافه کنیم.

<AddDevDependenciesSnippet />

## آزمایش کردن

بیایید با ایجاد فایل تست برای `CounterBloc`، به نام `counter_bloc_test.dart`، شروع کنیم و بسته تست را وارد کنیم.

<CounterBlocTestImportsSnippet />

بعداز آن، باید `main` و گروه تست خود را ایجاد کنیم.

<CounterBlocTestMainSnippet />

:::note
گروه‌ها برای سازماندهی تست‌های فردی (Individual) و همچنین برای ایجاد یک محیط (Context) که در آن می‌توانید یک `setUp` و `tearDown` مشترک را در تمام تست‌های فردی به اشتراک بگذارید، استفاده می‌شوند.
:::

بیایید با ایجاد نمونه‌ای از `CounterBloc` خود که در تمامی تست‌هایمان استفاده خواهد شد، شروع کنیم.

<CounterBlocTestSetupSnippet />

حالا می‌توانیم شروع به نوشتن تست‌های فردی خود کنیم.

<CounterBlocTestInitialStateSnippet />

:::note
می‌توانیم تمامی تست‌های خود را با استفاده از دستور `pub run test` اجرا کنیم.
:::

در این نقطه باید تست اولیه ما را پاس کرده باشیم! حالا بیایید یک تست پیچیده‌تر را با استفاده از بسته [bloc_test](https://pub.dev/packages/bloc_test) بنویسیم.

<CounterBlocTestBlocTestSnippet />

باید بتوانیم تست‌ها را اجرا کنیم و ببینیم که همه آنها پاس می‌شوند.

این تمام چیزی است که در آن وجود دارد، آزمایش باید سریع باشد و ما باید هنگام ایجاد تغییرات و بازسازی کد خود احساس اطمینان کنیم.

شما می‌توانید به برنامه [Weather App](https://github.com/felangel/bloc/tree/master/examples/flutter_weather) مراجعه کنید تا یک مثال از یک برنامه کاملاً تست شده را ببینید.
8 changes: 4 additions & 4 deletions docs/src/content/docs/fa/why-bloc.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,22 @@ sidebar:
order: 1
---

Bloc به شما امکان می‌دهد به راحتی لایه نمایش (Presentation) را از منطق کسب و کار (Business logic) جدا کنید، که این امر باعث می‌شود کد شما قابلیت هایی مانند _سرعت بالا_، _آزمون آسان_ و _قابل استفاده مجدد_ را داشته باشد.
Bloc به شما امکان می‌دهد به راحتی لایه نمایش (Presentation) را از منطق کسب و کار (Business logic) جدا کنید، که این امر باعث می‌شود, کد شما قابلیت هایی مانند _سرعت بالا_، _آزمون آسان_ و _قابل استفاده مجدد_ را داشته باشد.

وقتی اپلیکیشن‌های با کیفیت تولید می‌شوند، مدیریت وضعیت (state) به مسئله‌ای حیاتی تبدیل می‌شود.
وقتی اپلیکیشن‌های با کیفیت تولید می‌شوند، مدیریت وضعیت (State) به مسئله‌ای حیاتی تبدیل می‌شود.

ما به عنوان توسعه دهندگان می خواهیم:

- بدانیم درخواست ما در هر مقطع زمانی در چه وضعیتی است.
- به راحتی هر مورد را آزمایش کنیم تا مطمئن شوید برنامه ما به درستی پاسخ می دهد.
- به راحتی هر مورد را آزمایش کنیم تا مطمئن شویم برنامه ما به درستی پاسخ می دهد.
- هر تعامل کاربر را در برنامه خود ثبت کنیم تا بتوانیم تصمیمات مبتنی بر داده را اتخاذ کنیم.
- به صورت بهینه و کارآمد کار کنیم و اجزای مختلف را, هم در داخل برنامه‌ی خود و هم در برنامه‌های دیگر استفاده مجدد کنیم.
- امکان کار همزمان برای چندین توسعه‌دهنده و بدون هیچ مشکلی در یک کد پایه با رعایت الگوها و قواعد مشترک، فراهم باشد.
- برنامه های سریع و پاسخگو ایجاد کنیم.

بلاک برای برآورده کردن همه این نیازها و بسیاری دیگر طراحی شده است.

همچنین، راه‌حل‌های مدیریت وضعیت (State management) مختلفی وجود دارد و تصمیم گیری برای استفاده از یکی از آن‌ها ممکن است یک وظیفه سخت باشد. هیچ راه‌حل مدیریت وضعیتی کامل و بی‌نقص وجود ندارد! مهم این است که شما یکی را انتخاب کنید که برای تیم و پروژه شما بهترین عمل کند.
همچنین، راه‌حل‌های مدیریت وضعیت (State Management) مختلفی وجود دارد و تصمیم گیری برای استفاده از یکی از آن‌ها ممکن است یک وظیفه سخت باشد. هیچ راه‌حل مدیریت وضعیتی کامل و بی‌نقص وجود ندارد! مهم این است که شما یکی را انتخاب کنید که برای تیم و پروژه شما بهترین عمل کند.

Bloc با در نظر گرفتن سه ارزش اصلی طراحی شده است:

Expand Down

0 comments on commit b68ce3c

Please sign in to comment.