-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
bfe71f2
commit 1327f5c
Showing
1 changed file
with
147 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,147 @@ | ||
--- | ||
weight: 4 | ||
title: "التكرار" | ||
--- | ||
|
||
**[يمكنك العثور على جميع الشفرات المصدرية لهذا الفصل هنا](https://github.com/quii/learn-go-with-tests/tree/main/for)** | ||
|
||
للقيام بالأشياء بشكل متكرر في Go، ستحتاج إلى `for`. في Go لا توجد كلمات رئيسية مثل while، do، until، يمكنك فقط استخدام for. وهو أمر جيد! | ||
|
||
لنكتب اختبارًا لدالة تكرر الحرف 5 مرات. | ||
|
||
لا يوجد شيء جديد حتى الآن، لذا حاول كتابته بنفسك للتدرب. | ||
|
||
## لنكتب الاختبار الاول | ||
|
||
```go {filename="repeat_test.go"} | ||
package iteration | ||
|
||
import "testing" | ||
|
||
func TestRepeat(t *testing.T) { | ||
repeated := Repeat("a") | ||
expected := "aaaaa" | ||
|
||
if repeated != expected { | ||
t.Errorf("expected %q but got %q", expected, repeated) | ||
} | ||
} | ||
``` | ||
|
||
## حاول تشغيل الاختبار | ||
|
||
```text {filename="terminal"} | ||
./repeat_test.go:6:14: undefined: Repeat | ||
``` | ||
|
||
## اكتب الحد الأدنى من التعليمات البرمجية للاختبار ليتم تشغيله وتحقق من مخرجات الاختبار الفاشلة | ||
|
||
_حافظ على الانضباط!_ لست بحاجة إلى معرفة أي شيء جديد الآن حتى تجعل الاختبار يخفق بشكل صحيح. | ||
|
||
كل ما عليك فعله الآن هو ما يكفي لترجمة البرنامج حتى تتمكن من التحقق من كتابة الاختبار بشكل جيد. | ||
|
||
```go {filename="repeat.go"} | ||
package iteration | ||
|
||
func Repeat(character string) string { | ||
return "" | ||
} | ||
``` | ||
|
||
أليس من الجيد أن تعرف أنك متمكن بما يكفي بلغة Go لكتابة اختبارات لبعض المشكلات الأساسية؟ هذا يعني أنه يمكنك الآن اللعب بالشيفرة بقدر ما تريد وتعرف أن البرنامج يتصرف كما تتمنى. | ||
|
||
```text {filename="terminal"} | ||
repeat_test.go:10: expected 'aaaaa' but got '' | ||
``` | ||
|
||
## اكتب ما يكفي لنجاح الاختبار | ||
|
||
بناء الجملة "for" عادي للغاية ويتبع معظم اللغات المشابهة للغة C. | ||
|
||
```go {filename="repeat.go"} | ||
func Repeat(character string) string { | ||
var repeated string | ||
for i := 0; i < 5; i++ { | ||
repeated = repeated + character | ||
} | ||
return repeated | ||
} | ||
``` | ||
|
||
على عكس اللغات الأخرى مثل C أو Java أو JavaScript، لا توجد أقواس تحيط بالمكونات الثلاثة لعبارة for، والأقواس المعقوفة `{ }` مطلوبة دائمًا. | ||
|
||
قد تتساءل عما يحدث في السطر | ||
|
||
```go {filename="repeat.go"} | ||
var repeated string | ||
``` | ||
|
||
كما كنا نستخدم `:=` حتى الآن للاعلان عن المتغيرات وانشائها. ومع ذلك، `:=` هو ببساطة [اختصار لكلتا الخطوتين](https://gobyexample.com/variables). نحن هنا نعلن عن متغير من نوع "سلسلة نصية" string فقط من دون انشاء. يمكننا أيضًا استخدام `var` للإعلان عن الدوال، كما سنرى لاحقًا. | ||
|
||
قم بتشغيل الاختبار الان ويجب أن ينجح. | ||
|
||
تم وصف الاشكال الاخرى الإضافية لـ for [هنا](https://gobyexample.com/for). | ||
|
||
## إعادة الكتابة | ||
|
||
حان الوقت الآن لإعادة كتابة الكود والتعرف على عامل آخر هو `+=`. | ||
|
||
```go {filename="repeat.go"} | ||
const repeatCount = 5 | ||
|
||
func Repeat(character string) string { | ||
var repeated string | ||
for i := 0; i < repeatCount; i++ { | ||
repeated += character | ||
} | ||
return repeated | ||
} | ||
``` | ||
|
||
`+=` يسمى _"عامل الإضافة والاسناد"_، يقوم باضافة المعامل الأيمن (character) إلى المعامل الأيسر (repeat) ومن ثم يقوم باسناد النتيجة إلى المعامل الأيسر. وهذا العامل يعمل مع أنواع أخرى مثل الأعداد الصحيحة وغيرها. | ||
|
||
### المعايرة (اختبار الاداء) | ||
|
||
تعد كتابة [الاختبارات المعايرية](https://golang.org/pkg/testing/#hdr-Benchmarks) في Go ميزة أخرى من الدرجة الأولى (مدمجة) في اللغة وهي تشبه إلى حد كبير كتابة الاختبارات العادية. | ||
|
||
```go {filename="repeat_test.go"} | ||
func BenchmarkRepeat(b *testing.B) { | ||
for i := 0; i < b.N; i++ { | ||
Repeat("a") | ||
} | ||
} | ||
``` | ||
|
||
سترى أن الكود مشابه جدًا للاختبار العادي. | ||
|
||
يمنحك `testing.B` إمكانية الوصول إلى `b.N`. | ||
|
||
عند تنفيذ الكود المعياري، يتم تشغيله عدد مرات قيمة N ويقيس المدة التي يستغرقها للتنفيذ. | ||
|
||
لا ينبغي أن يهمك عدد مرات تشغيل الكود، حيث ستحدد Go القيمة "الجيدة" (b.N) تلقائياً للسماح لك بالحصول على بعض النتائج اللائقة. | ||
|
||
لتشغيل الاختبار المعياري، قم بكتابة `go test -bench=.` (أو إذا كنت تستخدم Windows Powershell `go test -bench="."`) | ||
|
||
```text {filename="terminal"} | ||
goos: darwin | ||
goarch: amd64 | ||
pkg: github.com/quii/learn-go-with-tests/for/v4 | ||
10000000 136 ns/op | ||
PASS | ||
``` | ||
|
||
ما يعنيه `136 ns/op` هو أن دالتنا تستغرق في المتوسط 136 نانو ثانية لتشغيلها (على جهاز الكمبيوتر الخاص بي). وهو أمر جيد جدًا! تم تشغيل هذا الاختبار 10000000 مرة. | ||
|
||
_ملاحظة_ بشكل افتراضي يتم تشغيل الاختبارات المعيارية بشكل تسلسلي. | ||
|
||
## تمارين للممارسة | ||
|
||
* تغيير الاختبار حتى يتمكن المستخدم لدالتنا من تحديد عدد مرات تكرار الحرف ومن ثم إصلاح الكود | ||
* اكتب "ExampleRepeat" لتوثيق دالتك | ||
* قم بإلقاء نظرة على حزمة [النصوص](https://golang.org/pkg/strings). ابحث عن الدوال التي تعتقد أنها قد تكون مفيدة وقم بتجربتها من خلال كتابة اختبارات مثل التي لدينا هنا. إن استثمار الوقت في تعلم المكتبة القياسية سيؤتي ثماره بمرور الوقت. | ||
|
||
## ختامًا | ||
|
||
* المزيد من ممارسة TDD | ||
* تعلمنا "for". | ||
* تعلمنا كيفية كتابة الاختبارات المعيارية |