اذهب إلى المحتوى

لوحة المتصدرين

  1. Mustafa Suleiman

    Mustafa Suleiman

    الأعضاء


    • نقاط

      5

    • المساهمات

      13207


  2. محمد Mmm2

    محمد Mmm2

    الأعضاء


    • نقاط

      4

    • المساهمات

      140


  3. عبدالله العطوي

    • نقاط

      3

    • المساهمات

      3


  4. سعيد عبدالله القندوس

    • نقاط

      3

    • المساهمات

      73


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 08/19/24 في كل الموقع

  1. لقد قمت بجميع لتحسين نموذج الخاص بي ولاكن دقه وصحه النموذج منخفضه كيف استطيع تحسينها اكثر ملف المشروع p1.ipynb
    3 نقاط
  2. 3 نقاط
  3. حل لمشكلة Gmail عندما اريد ان اوثق حسابي في Gmail برقم الجوال تخرج لي هذا النافذه ما هوا الحل
    2 نقاط
  4. عندي سؤال بسيط ليش اضاف رقم (1) في كلمة resolve(1) لكن في الدرس السابق ما اضافها علما بأني حاولت احذف رقم الواحد كتجربه لكن لم يعمل الكود
    2 نقاط
  5. السلام عليكم اخواني لقد اتممت بفضل الله ثم هذه الاكاديميه المحترمه و المحترفه دوره جافاسكريبت و قد حصلت علي الشهاده الحمد لله في الاول عملت المشاريع التطبيقيه مع المحاضر ولاكن فقط اخذت الفكره و تبقطها باسلوبي حتي اتمكن من تقويه نفسي و تعزيز الكود الحاص بي قد تواصلت مع خدمه العملاء و كانوا سريعين في الرد جزاهم الله كل خير انتظرت حتي يتم مراجعت مشاريعي و الحمد لله تم الموافقه عليها اتاني موعد الانترفيو الصوتي و كان مع الباشمهندس عبدالحميد و احب ان اقول يالها من مقابله مع شخص خلوق ذو خبره ربنا يبارك له و يزيده من علمه انتظرت فقط يوم واحد حتي يتم ابلاغي بالنتيجه و التي كانت بفضل الله بالقبول اتاني مشروع التخرج و كان علي ان اسلمه خلال 15 يوما و يلزم رفعه علي استضافه ليعمل مثل اي موقع الحمد لله قبل المده بكثير تم تسليم المشروع انتظرت عده ايام حتي يتم مراجعه الكود بالكامل و الحمد لله بعد مراجعه الكود كان يوجد ملاحظات تم حلها الحمد لله ثم تواصل معي مدير الاكاديميه الباشمهندس عبداللطيف الله يكرم الباشمهندس و يحقق ليه كل امانيه و يزيده من علمه فقد نصحني بماذا افعل في المستقبل و لكي احصل علي الشهاده و لكي يعطيني باقي الخطوات الان قد انهيت مغامراتي مع Django ايضا هنا في كورس Python و الان في مغامره جديده مع Ruby on rails احب ان اشكر حضراتكم و اشكر هذه الاكاديميه من كل قلبي فانا الان اسعد انسان لان اخيرا قد تحقق حلمي بعد مجهود و تعب دام قرابه السنه
    1 نقطة
  6. السلام عليكم انا اكتب تقرير عن جميع الدورات التي تعلمتها احتاج تذكيري بجميع الادوات والتقنيات التي استخدمناهم في تطوير لوحة التحكم وكذلك جميع الادوات والتقنيات التي في تطوير الموقع الاخباري
    1 نقطة
  7. هل في هذا الدوره هل سوفا نبناء تطبيقات للاندروايد و الايفون و هل سوفا نعمل مواقع ويب
    1 نقطة
  8. السلام عليكم. هل تعلم typescript يتطلب وجوبا تعلم oop. شكرا.
    1 نقطة
  9. وعليكم السلام ورحمة الله وبركاته . بعيدا عن typescript فإن تعلم ال OOP من الأمور المهمة التي لا غنى عنها لأى مبرمج حيث إن OOP من تسهل في تنظيم المشاريع الكبيرة و سهولة الصيانة وسهولة فهم الأكواد. ومن المؤكد أنك ستتعامل مع مشاريع أو حتي مكتبات وأطر عمل التي تم بنائها بإستخدام نمط OOP ولذلك إذا لم يكن لديك علم حول OOP فستجد صعوبة في إستخدامها أو التعامل مع تلك المكتبات وأطر العمل . أما بخصوص سؤالك فإن في TypeScript، لا يتطلب الأمر بالضرورة تعلم البرمجة الكائنية (OOP) لتتمكن من استخدام اللغة بشكل فعال. TypeScript هي لغة توفر أنواعًا ثابتة (static types) وتحسينات على JavaScript، مما يتيح لك كتابة رمز أكثر قوة ومرونة. مع ذلك، هناك بعض النقاط التي قد تجعل تعلم البرمجة الكائنية مفيدًا عند العمل مع TypeScript: الأنماط البرمجية: TypeScript تدعم البرمجة الكائنية، مما يعني أنه يمكنك استخدام الفئات (classes) والميراث (inheritance) وواجهات (interfaces) وغيرها من مفاهيم OOP. إذا كنت تتعامل مع مشاريع كبيرة أو فرق تطوير، فإن فهم OOP يمكن أن يساعد في تنظيم الكود وتحسين القابلية للصيانة. تنظيم الكود: البرمجة الكائنية يمكن أن تساعد في تنظيم الكود وتبسيط التعامل مع الكائنات والمكونات المختلفة، مما قد يكون مفيدًا في المشاريع الكبيرة والمعقدة. الأنماط الشائعة: بعض المكتبات والأطر (frameworks) في TypeScript تعتمد على أنماط OOP. على سبيل المثال، Angular يستخدم الكثير من مفاهيم OOP. لكن، يمكنك استخدام TypeScript دون الغوص بعمق في OOP . ولكن نصيحتي لك هي بدأ تعلم OOP أولا . ويمكنك قراءة المقال التالي حول ال OOP :
    1 نقطة
  10. السلام عليكم هي اي اسخدم الداله to_csv الموجود في مكتبه pandas ؟
    1 نقطة
  11. دالة to_csv الموجودة في مكتبة pandas تُستخدم لتحويل ال (DataFrame) إلى ملف CSV. و حفظها. import pandas as pd # إنشاء إطار بيانات بسيط data = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35], 'City': ['New York', 'San Francisco', 'Los Angeles']} df = pd.DataFrame(data) # حفظ البيانات في ملف CSV df.to_csv('output.csv', index=False) ولكن من فضلك إذا كان هذا سؤال خاص بدرس من دروس الدورة فيرجي إرفاق السؤال أسفل الدرس حيث يوجد صندوق للتعليقات كما هنا حيث يجب وضع السؤال هناك . حيث هنا هو قسم الأسئلة العامة ولا نجيب علي أسئلة الدورات هنا وذلك لمساعدتك بشكل أفضل.
    1 نقطة
  12. كيففكم ييا اصصدققاءء لديه هذذا الكود تعدييل البياانات بديي لما الممسسستخدم ييعدل المعللومات اللخاصة فييه --- لو كان مختار (نعم) سيكون هو رافع صوره خاصه فيه ولو بدو بيجي يعدل على المعلومات ويختار (لا) بدي الصور الذي تم رفعها قديما بدياها تحذف من قاعدة البيانات ومن مجلد اسمه ben ارجوا المساعدة <?php include("con.php"); $id=$_POST['id']; $error = false; $errorMsg = ''; $extensions = array("jpg", "jpeg", "png", "gif"); @$e1 = strip_tags($_POST['e1']); @$er = strip_tags($_POST['er']); @$il = strip_tags($_POST['il']); @$fi = strip_tags($_POST['fi']); //// $targetDir = "ben/"; $uploadOk = 1; if ($_SERVER["REQUEST_METHOD"] == "POST") { $k = htmlspecialchars($_POST["k"], ENT_QUOTES, 'UTF-8'); $targetDir = "ben/"; $uploadOk = 1; if ($k == "نعم" && isset($_FILES["fi"]) && $_FILES["fi"]['size'] > 0) { $targetFile = $targetDir . basename($_FILES["fi"]["name"]); $imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION)); if ($_FILES["fi"]["size"] > 0.1 * MB) { $errorMsg .= "\nعذراً، حجم الملف كبير جداً."; $uploadOk = 0; $error = true; } $ext = pathinfo($_FILES["fi"]["name"], PATHINFO_EXTENSION); if (!in_array($ext, $extensions)) { $errorMsg .= "\nالملف ليس صورة."; $uploadOk = 0; $error = true; } if ($uploadOk == 1) { if (move_uploaded_file($_FILES["fi"]["tmp_name"], $targetFile)) { echo "تم رفع الملف "; $fi= basename($_FILES["fi"]["name"]); } } } elseif ($k == "لا" && isset($_FILES["fi"]) && $_FILES["fi"]['size'] > 0) { $targetFile = $targetDir . basename($_FILES["fi"]["name"]); $imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION)); if ($_FILES["fi"]["size"] > 0.1 * MB) { $errorMsg .= "\nعذراً، حجم الملف كبير جداً."; $uploadOk = 0; $error = true; } $ext = pathinfo($_FILES["fi"]["name"], PATHINFO_EXTENSION); if (!in_array($ext, $extensions)) { $errorMsg .= "\nالملف ليس صورة."; $uploadOk = 0; $error = true; } if ($uploadOk == 1) { if (move_uploaded_file($_FILES["fi"]["tmp_name"], $targetFile)) { echo "تم رفع الملف "; $fi = basename($_FILES["fi"]["name"]); } } } } ///// $files_fields = ""; if( !empty($fi) ) { $files_fields .= ", `fi` = '{$fi}'"; } $updateSql = "UPDATE `us` SET `e1`='{$e1}', `er`='{$er}', `il`='{$il}', {$files_fields} where id={$id}"; $update = mysqli_query($con, $updateSql) or die(mysqli_error($con)); if (mysqli_affected_rows($con) == 1 ) { echo "<script>alert('تمت التعديل بنجاح!')</script>"; } else { } ?>
    1 نقطة
  13. طبيعة المشكلة تصنيف ثنائية binary classification مع بيانات غير متوازنة، لذا عليك التعامل مع عدم توازن البيانات باستخدام SMOTE وهي من أفضل تقنيات معالجة عدم توازن البيانات، حيث تقوم بإنشاء عينات جديدة من فئة الأقلية بطريقة ذكية. from imblearn.over_sampling import SMOTE smote = SMOTE(random_state=42) X_train, y_train = smote.fit_resample(X_train, y_train) حاول تجربة أساليب اختيار ميزات أخرى بالإضافة إلى Random Forest، مثل Recursive Feature Elimination (RFE) أو Feature Importance from Linear Models لاستخدام معاملات النماذج الخطية (مثل Logistic Regression) لتحديد أهمية الميزات. إليك مثال RFE مع التحقق المتقاطع cross-validation لاختيار أفضل عدد من الميزات و تجنب فرط التخصيص: from sklearn.feature_selection import RFECV estimator = LogisticRegression(solver='liblinear') selector = RFECV(estimator, cv=5, scoring='accuracy') # استخدام 5 طيات للتحقق المتقاطع selector = selector.fit(X, y) selected_features = X.columns[selector.support_] X = X[selected_features] ثم جرب بنية أعمق قليلاً مع طبقات Dropout لتجنب فرط التخصيص. model = Sequential() model.add(Dense(128, input_dim=X_train.shape[1], activation='relu', kernel_regularizer='l2')) model.add(Dropout(0.4)) model.add(Dense(64, activation='relu')) model.add(Dropout(0.3)) model.add(Dense(32, activation='relu')) model.add(Dense(1, activation='sigmoid')) ثم تحسين عملية التدريب ويُعد مُحسِّن Adam خيارًا جيدًا لمعظم مشاكل الشبكات العصبية، أيضًا استخدم Early Stopping لإيقاف التدريب عندما يتوقف أداء النموذج عن التحسن على بيانات التحقق. from tensorflow.keras.callbacks import EarlyStopping early_stopping = EarlyStopping(patience=10) # إيقاف التدريب بعد 10 حقب بدون تحسن history = model.fit(..., callbacks=[early_stopping]) ولا تعتمد على الـ accuracy فقط، بل استخدم مُقاييس أخرى مثل precision, recall, F1-score, و AUC لتقييم أداء النموذج بشكل شامل، خاصةً مع البيانات غير المتوازنة.
    1 نقطة
  14. الأفضل الماك بوك بالطبع من حيث البرمجة والتصميم، الجيد في نظام الويندوز هو الحرية وعدم التقيد والتكلفة الأقل بمراحل. فعليك الإختيار بما يناسبك، فبتكلفة 8000 ريال تستطيعي إنشاء SETUP كامل مكون من لابتوب بنظام ويندوز بمواصفات مرتفعة وشاشة وماوس ومكتب. إن كانت الميزانية هي الأهم حاليًا فلا مشكلة في تأجيل شراء الماك بوك.
    1 نقطة
  15. بتلك الميزانية لما لا تقومين بشراء Apple MacBook Pro 14 M3 Pro ؟ يمكنك شراء جهاز جديد بشريحة M3 ورامات 18 جيجابايت ومساحة تخزين 512، بتكلفة 8000 ريال. والشاشة الخاصة بذلك اللاب توب هي Retina XDR بدقة 4k وبمقاس 14 بوصة. يمكنك خفض الميزانية من خلال شراء لابتوب مستعمل من شخص أو refurbished رسمي من أبل أي لابتوب تم إصلاحه من الشركة نفسها، ستجدي ذلك هنا: https://www.apple.com/shop/refurbished/mac/mac-pro-macbook-pro ستحصلين على لابتوب جديد وبمواصفات أعلى وتكلفة أقل. وفي رأي ستحتاجين إلى شاشة خارجية وماوس لإنتاجية أفضل والحفاظ على عينيك أيضًا، فشاشة بمقاس 27 ودقة 2k أو 4K ستكون جيدة لك حسب الميزانية فكلاهما مناسب. والشاشة يجب أن تكون من نوع IPS من أجل دقة ألوان وزوايا رؤية أفضل، مع نسبة sRGB مرتفعة الأفضل 100%، الخيارات التالية جيدة: ASUS 31.5” 4K HDR Eye Care Monitor (VP327Q) – UHD (3840 x 2160) BenQ PD2705Q في حال تريدين لابتوب بنظام ويندوز أخبريني.
    1 نقطة
  16. الميزانية من 7000 إلى 8000 ريال سعودي تصميم ع ps & ai & Affinity Designer وليس هناك نوع محدد حسب طلب العميل وليس تعديل ع الصور بل رسم وكما ذكرت فان لدي حساسية لذلك تهمني الشاشة وخاصة اني اجلس عند الجهاز ثلاث اربع يومي وشكرا لك
    1 نقطة
  17. الخيارات كثيرة، علينا تقليصها، أرجو الإجابة على التالي: ما هي الاستخدامات التي سيتم شراء لابتوب من أجلها؟ ذكرتي أنها برمجة وتصميم، فما هو التصميم المقصود؟ لكي يتم تحديد الشاشة المناسبة للتصميم والمريحة لعينك أيضًا بسبب الحساسية. ما هي الميزانية المتاحة؟
    1 نقطة
  18. https://pcpalace.com.sa/products/DELL-G15-5530-Gaming-i9 وجدت هذا الجهاز لكن لم استطيع معرفة معايير الشاشة التي ذكرت كما لم استطيع معرفة Flicker-Free هل تستطيع اخباري عن هذا الجهاز هل هو جيد ام لا ؟ وكيف اعرف مميزات الجهاز كاملة ؟
    1 نقطة
  19. إذن المكتبة غير مثبتة ستحتاج إلى تنفيذ الأمر: pip install wrapt
    1 نقطة
  20. السؤال الذي قد يتبادر إلى أذهان مُطوّري الجافا هو "ما الذي عليّ أن أتعلمه الآن؟". هناك مجموعة من اللغات التي تستحق الاعتبار، مثل Clojure, Rust أو Haskell. ولكن ماذا لو كنت تريد أن تتعلم شيئًا يساعدك على دفع الفواتير وهو فوق ذلك سهل الاستخدام؟ Kotlin قد يكون خيارك الأفضل، وسنحاول في هذه المقالة أن نشرح لماذا. ما هو Kotlin؟ لغة برمجة مُطوّرة من قبل JetBrains، والذين كانوا وراء فكرة IntelliJ IDEA IDE بالإضافة إلى أشياء أخرى. بديل بسيط ومرن لجافا تتلاءم جيدًا مع أكواد جافا الموجودة تُترجم لجافا bytecode تعمل على JVM كما تُترجم أيضًا لجافا سكريبت إن كنت قد قرأت وثائقها فستلاحظ مجموعة من الأمور المهمة: تتيح لك القيام بالكثير من الأشياء بأكواد قليلة تحل الكثير من المشاكل الموجودة في جافا تساعدك على الاستمرار في استخدام النظام البيئي ecosystem المعتاد لجافا تتيح لك برمجة الواجهة الأمامية والخلفية بنفس اللغة 100٪ متوافقة مع الجافا أداؤها جيد مقارنةً بالبدائل (Clojure, Scala) لا تضيف إلّا طبقةً رقيقة من التّعقيد على جافا يبدو هذا جيدًا، أليس كذلك؟ فيما يلي سنرى بعض الأمثلة لمقارنتها بالجافا. عناصر القِيَم مقابل بيانات الأصناف Value objects vs data classes ما تراه هنا هو كائن جافا قديم ((POJO مع الأنماط المعتادة: public class HexagonValueObject { private final int x; private final int y; private final int z; public HexagonValueObject(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } public int getX() { return x; } public int getY() { return y; } public int getZ() { return z; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; HexagonValueObject hexagon = (HexagonValueObject) o; return getX() == hexagon.getX() && getY() == hexagon.getY() && getZ() == hexagon.getZ(); } @Override public int hashCode() { return Objects.hash(getX(), getY(), getZ()); } @Override public String toString() { return "HexagonValueObject{" + "x=" + x + ", y=" + y + ", z=" + z + '}'; } إنشاء عناصر القِيَم هو عملية مرهقة حتى باستخدام المكتبات مثل Lombok) Lombok يتطلب تثبيت ملحقة في بيئة العمل IDE الخاصة بك من أجل أن يعمل، وهو أمر قد لا يكون ممكنًا في جميع بيئات التطوير، يمكن تجاوز هذا المشكل بأدوات مثل Delombok، ولكنه اختراق أكثر منه حل للمشكلة)، على الأقل IDEA (أو Eclipse) يمنحك بعض المساعدة في توليد الكثير من تلك الوظائف، ولكنّ إضافة حقل ونسيان تعديل الوظيفة equals سيؤدي إلى مفاجآت سيئة. دعونا ننظر الآن إلى الكود المقابل في Kotlin: data class HexagonDataClass(val x: Int, val y: Int, val z: Int) مذهل! لقد اختصرنا الكثير من الكتابة بالمقارنة مع نسخة جافا. بيانات الأصناف في Kotlin تعطيك equals + hashCode و toString بالإضافة إلى المُحصّلات والمُعيِّنات (getters and setters). يمكنك أيضًا نسخها، مما يخلق كائنًا جديدًا مع إعادة كتابة بعض حقوله. حشو سلاسل النصوص String interpolation التعامل مع سلاسل النصوص في الجافا مرهق. ولكن يمكن تبسيطه باستخدام String.format ومع ذلك ستبقى قبيحة. public class JavaUser { private final String name; private final int age; public String toHumanReadableFormat() { return "JavaUser{" + "name='" + name + '\'' + ", age=" + age + '}'; } public String toHumanReadableFormatWithStringFormat() { return String.format("JavaUser{name='%s', age=%s}", name, age); } } Kotlin وجد حلّا لهذا، حيث أضاف مفهوم حشو السلاسل، مما بسّط استخدام المتغيرات في السلاسل الحرفية. ومكّن أيضًا استدعاء الوظائف منها! class KotlinUser(val name: String, val age: Int) { fun toHumanReadableFormat() = "JavaUser{name='$name', age=$age}" fun toHumanReadableFormatWithMethodCall() = "JavaUser{name='${name.capitalize()}', age=$age}" } دوال التمديد Extension functions كتابة المُلقّمات decorators في جافا يمكن أن يكون صعبًا، كما أنّها ليست مثالية. إذا كنت تريد أن تكتب مُلقّمًا، والذي يمكن استخدامه مع جميع الأصناف التي تقدّم List فلا يمكنك ببساطة استخدامه في الملقم خاصتك لأنّه سيحتاج منك أن تقدم الكثير من الوظائف الأخرى، لذلك ستكون مضطرًّا لتمديد AbstractList. public class ListPresenterDecorator<T> extends AbstractList<T> { private List<T> list; public ListPresenterDecorator(List<T> list) { this.list = list; } public String present() { return list.stream() .map(Object::toString) .collect(Collectors.joining(", ")); } @Override public T get(int index) { return list.get(index); } @Override public int size() { return list.size(); } } إذا كنت بحاجة إلى تلقيم شيء ما ولكنه لا يوفر أصنافًا أساسية base classes مفيدةً مثل AbstractList أو الصنف final، فأنت لا تستطيع ذلك ببساطة. لكن وظائف التمديد Extension methods يمكن أن تعطيك الحل! fun <T> List<T>.present() = this.joinToString(", ") تتصرف هذه الوظيفة كمُلقّم لجميع الأصناف Lists. لو قارنّا هذا ببديله في الجافا فإنّ هذ السطر الصغير أبسط بكثير، والأكثر من ذلك سوف يعمل أيضًا مع الأصناف final. حاول ألّا تسيء استخدامها وحسب. التحقق من العدمية Null safety التحقق من القيم المعدومة null ينطوي على الكثير من التعابير المنطقية والأنماط. مع ظهور الجافا، يمكنك أخيرًا التعامل مع هذه المشكلة بواسطة الصنف Optional، لكن ماذا لو كان مرجعOptional معدومًا null؟ ستحصل على NullPointerException، فلا زلنا بعد مرور 20 عام على ظهور جافا لا نستطيع تحديد العنصر الذي كان معدومًا. نأخذ المثال التالي: public class JavaUser { static class Address { String city; } private final String firstName; private final String lastName; private final List<Address> addresses; /** * If you want to make sure nothing is `null` * you have to check everything. */ public static String getFirstCity(JavaUser user) { if(user != null && user.addresses != null && !user.addresses.isEmpty()) { for(Address address : user.addresses) { if(address.city != null) { return address.city; } } } throw new IllegalArgumentException("This User has no cities!"); } } مع Kotlin، لديك العديد من الخيارات. إذا كان مشروعك متداخلًا مع مشاريع جافا يمكنك استخدام عامل التحقق من العدميّة (؟)null safety operator: data class KotlinUserWithNulls(val firstName: String?, // String? means that it is either a String object or a null val lastName: String?, val addresses: List<Address> = listOf()) { data class Address(val city: String?) companion object { fun fetchFirstCity(user: KotlinUserWithNulls?): String? { user?.addresses?.forEach { it.city?.let { return it } } return null } } } الكود الموجود بعد ؟ لن يُنفّذ إلا إن كان المعامل الأيسر operand غير معدوم not null. الدالة let تنشئ ارتباطًا محليًّا للكائن المُستدعى بحيث أنّ it سوف تشير إلى it.city. أما إن كان عملك مفصولًا عن الجافا فأقترح الابتعاد عن كل ما له علاقة بـ null data class KotlinUserWithoutNulls(val firstName: String, // this parameter can't be null val lastName: String, val addresses: List<Address> = listOf()) { data class Address(val city: String) companion object { fun fetchFirstCity(user: KotlinUserWithNulls) = user.addresses.first().city } } إذا لم يكن هناك أي استخدام لـ null (لا وجود لـ ؟) فكل شيء سيصبح أكثر بساطةً. استنباط النوع Type Inference Kotlin يدعم استنباط الأنواع، مما يعني أنه قادر على معرفة الأنواع من سياقها. أي مثل العامل الماسي diamond notation في الجافا <>! نأخذ المثال التالي: public class JavaUser { // ... private final String firstName; private final String lastName; private final List<Address> addresses; public Address getFirstAddress() { Address firstAddress = addresses.get(0); return firstAddress; } } هذا يبدو نفسه تقريبًا في Kotlin: data class KotlinUser(val firstName: String, val lastName: String, val addresses: List<Address> = listOf()) { data class Address(val city: String) /** * This is the same as in `JavaUser`. */ fun getFirstAddressNoInference(): Address { val firstAddress: Address = addresses.first() return firstAddress } } وذلك حتى تدع Kotlin تكتشف أنواع المتغيرات الخاصة بك: /** * Here the type of `firstAddress` is inferred from the context. */ fun getFirstAddressInferred(): Address { val firstAddress = addresses.first() return firstAddress } أو حتى الوظائف: /** * Here the return type is inferred. Note that * if a method consists of only one statement * you can omit the curly braces. */ fun getFirstAddress() = addresses.first() لا داعي للتحقق من الاستثناءات No checked exceptions ربما رأيت الكود التالي مليون مرة من قبل: public class JavaLineLoader { public List<String> loadLines(String path) { List<String> lines = new ArrayList<>(); try(BufferedReader br = new BufferedReader(new FileReader(path))) { String line; while((line = br.readLine()) != null) { lines.add(line); } } catch (IOException e) { e.printStackTrace(); } return lines; } } لأصحاب المدرسة القديمة في (IO in Java). لاحظوا التعليمة try في الكود أعلاه، الأمر نفسه سيُكتب هكذا في Kotlin: class KotlinLineLoader { fun loadLines(path: String) = File(path).readLines() } هناك بضعة أشياء ينبغي الانتباه إليها، أولًا: Kotlin ألغى التحقق من الاستثناءات. ثانيًا: Kotlin أضاف استخدام الكائنات من نوع Closeable أي: يمكنك أن تلاحظ أيضًا أنّ دالة التمديد (readLines) أضيفت إلى الصنف File. هذا النمط موجود بكثرة في Kotlin. إذا كنت قد استخدمت Guava أو Apache Commons أو شيء مماثل من قبل، فغالبًا سترى وظائف مشتركة تضاف منها إلى الصنف JDK كدالة تمديد. وهذا قد يكون مفيدًا لصحتك (أعصابك على الأقل). دعم لامبدا Lambda support دعونا نلقي نظرة على دعم lambda في الجافا: public class JavaFilterOperation { private List<String> items; @FunctionalInterface interface FilterOperation { Boolean filter(String element); } private List<String> filterBy(FilterOperation fn) { return items.stream() .filter(fn::filter) // applying the function .collect(Collectors.toList()); } public void doFilter() { filterBy((element) -> { return element.length() > 0; // calling the function with an actual lambda }); } } بما أنّه لا توجد قاعدة محددة لكتابة أنواع معاملات الوظائف method parameter types، فسيكون علينا إنشاء واجهة لها بأنفسنا. لاحظ أننا يمكن أن نستخدم Function<String, Boolean> هنا، ولكنها لن تعمل إلّا على الدوال ذات المعامل الواحد! هناك بعض الواجهات في JDK لحل هذه المشكلة، ولكن الكود سيكون مربكًا وغير واضح (مثلًا، ما دور BiFunction هنا؟)، Kotlin يحسّن هذا قليلًا: class KotlinFilterOperation { private val items = listOf<String>() fun filterBy(fn: (String) -> Boolean) = items.filter(fn) fun doFilter() { filterBy(String::isNotEmpty) // note the exension function `isNotEmpty` added to `String`! } } Kotlin يضيف قاعدةً نحويةً من أجل تمرير الدوال كمعاملات: (ParamType1, ...ParamTypeN) -> ReturnType. Kotlin يوفر مراجع للوظائف والحقول، كما يمكنك أيضًا التأشير إلى وظيفة من كائن ملموس! باستخدام المثال أعلاه يمكنني التأشير إلى الوظيفة filterBy من عيّنة instance ملموسة، هكذا: val reference = KotlinFilterOperation()::filterBy البرمجة الوظيفيّة Functional programming البرمجة الوظيفيّة أصبح لها ضجة في الوقت الحاضر. ومع جافا 8، قدمت Oracle مقاربتها لهذا الموضوع: الواجهة البرمجية Stream (Stream API). وهي تعمل كالتالي: public class JavaUser { // ... public static Set<String> fetchCitiesOfUsers( List<JavaUser> users) { return users.stream() .flatMap(user -> user.addresses.stream()) .map(JavaUser.Address::getCity) .collect(Collectors.toSet()); } } المقابل في Kotlin مشابه إلى حد ما، ولكن باختلافات دقيقة: fun fetchCitiesOfUsers(users: List<KotlinUser>) = users .flatMap(KotlinUser::addresses) .map(Address::city) .toSet() لا يوجد تحويل صريح للتسلسلات streams بما أنّ كل تجميعات Kotlin تدعمها. كنتيجة مباشرة لذلك، لن يكون عليك تمرير لامبدا لـ flatMap. تجميع النتيجة يحدث تلقائيًّا (لا حاجة لاستدعاء الوظيفة *Collectors.to). واستخدامنا لـ toSet هنا سببه الوحيد أننا نريد إرجاع عنصر من نوع Set. وإلا فيمكن حذف.toSet() توافقية جافا وKotlin يمكن أن يكون هذا معقدًا لمعظم النّاس، لكن JetBrains تعاملت مع هذا الأمر بالشكل الصحيح: public class KotlinInterop { public void helloJava() { System.out.println("Hello from Java!"); } public void helloKotlin() { JavaInterop.createInstance().helloKotlin(); } } class JavaInterop { fun helloJava() { KotlinInterop().helloJava() } fun helloKotlin() { println("Hello from Kotlin!") } companion object { @JvmStatic fun createInstance() = JavaInterop() } } التداخل هنا سلس وسهل. جافا وKotlin يمكن أن يتعايشا معًا في نفس المشروع، كما يقدم Kotlin مجموعة من التعبيرات (مثل @JvmStatic) لتسهيل استدعاء كود Kotlin من الجافا دون أية مشاكل. قد تكون قد لاحظت من هذه الأمثلة أن Kotlin يستعير الأفكار الجيدة من جافا ويُحسّنها ويحاول أن يختصر عليك الوقت والعمل إلى أدنى حد ممكن. الأنباء الأخيرة حول اعتزام جوجل جعل Kotlin واحدةً من اللغات المعتمدة علىAndroid تدعم هذا التوجه أيضًا. أشياء لتخبر بها مديرك: إذا كنت ترغب في إعطاء Kotlin فرصة فإليك بعض النصائح التي ستساعدك عند التفاوض مع مديرك أو زملائك في الفريق: Kotlin خرج من عالم الصناعة، وليس من العالم الأكاديمي. فهو يحل المشاكل التي يواجها المبرمجون اليوم. حر ومفتوح المصدر يأتي ومعه أداة مفيدة لتحويل جافا إلى Kotlin يمكنك مزج Kotlin وجافا دون جهد يُذكر يمكنك استخدام جميع أدوات وأُطُر عمل جافا الموجودة Kotlin مدعوم من قبل أفضل بيئة عمل في السوق (مع نسخة مجانية) من السهل قراءته، فحتى المبرمجون غير المتخصصون في Kotlin يمكنهم مراجعة الأكواد المكتوبة به لا تحتاج إلى رهن مشروعك بـ Kotlin: يمكنك البدء في المرحلة الأولى بكتابة الاختبارات فيه. من غير المرجح أن تتخلى JetBrains عن Kotlin لأنه يُقوّي مبيعاتها Kotlin لديه مجتمع حيوي، كما يمكنك بسهولة أن تساهم في Kotlin وتقترح ميزات جديدة باستخدام KEEP إذن، هل يستحق Kotlin الضجة المثارة حوله؟ الحكم لك. ترجمة -وبتصرّف- للمقال Kotlin is the new Java لكاتبه Adam Arold
    1 نقطة
×
×
  • أضف...