נושאים פעיליםנושאים פעילים  הצגת רשימה של חברי הפורוםרשימת משתמשים  חיפוש בפורוםחיפוש  עזרהעזרה
  הרשמההרשמה  התחברותהתחברות RSS עדכונים
תיכנות
RSS UnderWarrior Forums : RSS תיכנות
נושא

נושא: איך לייעל את הקוד? C#

שליחת תגובהשליחת נושא חדש
כותב
הודעה << נושא קודם | נושא הבא >>
ששון
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 28 April 2009 בשעה 11:49 | IP רשוּם
ציטוט ששון

אני צריך קוד של בחירה באמצעות החצים, אבל אני לא יודע מה הדרך הנכונה לעשות זאת. הנה קוד ממש לא יעיל שמדגים למה אני מתכוון, בבקשה שמישהו יריץ אותו בc# ויגיד לי איך לעשות את מה שאני צריך בצורה הנכונה... תודה!

קוד:
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.ForegroundColor = ConsoleColor.White;
            string PositionBefore = "";
            string PositionAfter = "";

            First:
            Console.Clear();
            Console.CursorVisible = false;
            Console.WriteLine("Please select an option:\n");
            Console.Write("(1) ");
            Console.BackgroundColor = ConsoleColor.Blue;
            Console.Write("First Option");
            Console.BackgroundColor = ConsoleColor.Black;
            Console.Write("\n(2) ");
            Console.Write("Second Option");
            Console.Write("\n(3) ");
            Console.Write("Third Option");
            PositionBefore = "First";
            goto Select;

            Second:
            Console.Clear();
            Console.WriteLine("Please select an option:\n");
            Console.Write("(1) ");
            Console.Write("First Option");
            Console.Write("\n(2) ");
            Console.BackgroundColor = ConsoleColor.Blue;
            Console.Write("Second Option");
            Console.BackgroundColor = ConsoleColor.Black;
            Console.Write("\n(3) ");
            Console.Write("Third Option");
            PositionBefore = "Second";
            goto Select;

            Third:
            Console.Clear();
            Console.WriteLine("Please select an option:\n");
            Console.Write("(1) ");
            Console.Write("First Option");
            Console.Write("\n(2) ");
            Console.Write("Second Option");
            Console.Write("\n(3) ");
            Console.BackgroundColor = ConsoleColor.Blue;
            Console.Write("Third Option");
            Console.BackgroundColor = ConsoleColor.Black;
            PositionBefore = "Third";
            goto Select;


            Select:
            bool doContinue;
            ConsoleKeyInfo key;
            do
            {
                key = Console.ReadKey(true);
                doContinue = key.Key.ToString() == "UpArrow" || key.Key.ToString() == "DownArrow" || key.Key.ToString() == "Enter";
                if (doContinue)
                {
                    if (key.Key.ToString() == "Enter") goto Next;

                    if (PositionBefore == "First")
                    {
                         if (key.Key.ToString() == "UpArrow")
                         {
                             PositionAfter = "Third";
                             goto Third;
                         }
                         if (key.Key.ToString() == "DownArrow")
                         {
                             PositionAfter = "Second";
                             goto Second;
                         }
                    }
                    if (PositionBefore == "Second")
                    {
                         if (key.Key.ToString() == "UpArrow")
                         {
                             PositionAfter = "First";
                             goto First;
                         }
                         if (key.Key.ToString() == "DownArrow")
                         {
                             PositionAfter = "Third";
                             goto Third;
                         }
                    }
                    if (PositionBefore == "Third")
                    {
                         if (key.Key.ToString() == "UpArrow")
                         {
                             PositionAfter = "Second";
                             goto Second;
                         }
                         if (key.Key.ToString() == "DownArrow")
                         {
                             PositionAfter = "First";
                             goto First;
                         }
                    }
                }
            }
            while (!doContinue);

            Next:
            Console.WriteLine("\n\nSucceeded. You chose the {0} option.", PositionAfter.ToLower());
            Console.CursorVisible = true;
        }
    }
}

חזרה לתחילת העמוד הצג את כרטיס החבר של ששון חפש הודעות אחרות של ששון בקר בדף הבית של ששון
 
עזריה
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 28 April 2009 בשעה 13:23 | IP רשוּם
ציטוט עזריה

שלום,

דבר ראשון, כמעט ואף פעם לא משתמשים בתיכנות עם "קפיצות" (goto) בשפות עיליות. הסיבה שלא עושים זאת זה כיוון שכל קטע קוד שקופצים אליו יכול להיכתב כפונקציה משל עצמה, במקום שימוש ב-goto ניתן פשוט לקרוא לפונקציה. שימוש בפונקציה תעשה בצורה גינרית ללא תלוי במצב התוכנית הכללית. לדוגמא פונקציה הכותבת לקובץ, מחזירה ערך מוחלט, מזיזה את העכבר למיקום מסוים... וכן הלאה, אינה תלויה במצב התוכנית הנוכחי. לעומת זאת הפונקציה תלויה ישירות בערכי הפרמטרים שנשלחים אליה, וכך התנהגות הפונקציה משתנה בהתאם לאלו.

בבעיה שלך ניתן לראות בבירור שקטעי הקוד First,Second,Third מבצעים את אותו קטע קוד. לכן ניתן היה לבנות פונקציה גינרית המקבלת פרמטרים מסוימים ומציגה אותם למסך. וכך כאשר צריך היה להציג את First שולחים את פרמטרי first לפונקציה והיא מציירת אותם.

הלוגיקה (קטע הלולאה) נשארת אך כעת במקום "לקפוץ" כל הזמן מקטע לקטע, קוראים לפונקציה בכל ציור. וכאשר מקבלים ערך enter יכולים פשוט לבצע break במקום קפיצה ל-next.

פתרון נוסף אלגנטי נקי ודינאמי, המאפשר בניית והוספת מסכים בקלות, אפילו בזמן ריצה יהיה -
הוספת מחלקה בשם Screen כאשר יש לה פונקציית ציור, קישור (Reference) למסך הבא ולמסך הקודם, פונקציית קלט, ופונקציית לוגיקה. התוכנית היא פשוטה: בתחילתה אתה בונה את המסכים ומקשר בינהם מפעיל על המסך הראשון את פונקצית הלוגיקה, הפונקציה קוראת לפונקצית הציור ואחריה לפונקצית הקלט ומחליטה לאיזה מהמסכים המקושרים לעבור אם בכלל. פשוט נוח וקל.

חזרה לתחילת העמוד הצג את כרטיס החבר של עזריה חפש הודעות אחרות של עזריה בקר בדף הבית של עזריה
 
ששון
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 28 April 2009 בשעה 14:55 | IP רשוּם
ציטוט ששון

עזריה, אני יודע מהן פונקציות וכיצד להשתמש בהן. בחרתי להשתמש ב-goto רק בשביל ההדגמה.
לגבי הפסקה האחרונה שרשמת- אני לא מחפש מחלקות וסיבוכים. כל מה שרציתי זה את הדרך לעשות בחירה ע"י החצים ללא הצורך לצייר כל פעם תמונה מחדש. יש משהו בדוטנט שמאפשר את זה...
חזרה לתחילת העמוד הצג את כרטיס החבר של ששון חפש הודעות אחרות של ששון בקר בדף הבית של ששון
 
ניר
מנהל האתר
מנהל האתר
סמל אישי

הצטרף / הצטרפה: 12 January 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 3296
נשלח בתאריך: 28 April 2009 בשעה 22:16 | IP רשוּם
ציטוט ניר

ששון - תקשיב לעזריה - הוא אומר דברים חכמים.

למיטב ידיעתי יכולות ה-Console של NET מוגבלים בכוונה, אתה לא אמור לפתח מפלצות ב-Console


__________________
מספר האייסיקיו שלי ו/או כתובת ה-MSN שלי אינם מהווים מוקד תמיכה
חזרה לתחילת העמוד הצג את כרטיס החבר של ניר חפש הודעות אחרות של ניר בקר בדף הבית של ניר
 
ששון
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 29 April 2009 בשעה 02:59 | IP רשוּם
ציטוט ששון

תודה ניר. לא זלזלתי במה שעזרתי כתב, העניין הוא שאני מחפש דרך אחרת לעשות זאת שהיא לא ציור מחדש כל פעם...
חזרה לתחילת העמוד הצג את כרטיס החבר של ששון חפש הודעות אחרות של ששון בקר בדף הבית של ששון
 
ששון
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 29 April 2009 בשעה 02:59 | IP רשוּם
ציטוט ששון

במה שעזריה* כתב.
חזרה לתחילת העמוד הצג את כרטיס החבר של ששון חפש הודעות אחרות של ששון בקר בדף הבית של ששון
 

אם ברצונך להגיב לנושא זה עליך קודם להתחבר
אם אינך רשום/ה כבר עליך להרשם

  שליחת תגובהשליחת נושא חדש
גרסת הדפסה גרסת הדפסה

קפיצה לפורום
אינך יכול/ה לשלוח נושאים חדשים בפורום זה
אינך יכול/ה להגיב לנושאים בפורום זה
אינך יכול/ה למחוק את הודעותיך ותגוביך בפורום זה
אינך יכול/ה לערוך את הודעותיך ותגובותיך בפורום זה
אינך יכול/ה לצור סקרים בפורום זה
אינך יכול/ה להצביע בסקרים בפורום זה