سؤال

أريد طباعة حدود المربع ... قد يطبع جانب واحد فقط، أو المزيد من جوانب المربع، لذلك كتبت هذه الطريقة

printBorder(N, E, S, W) {
  if (N) {
     square.printBorder(0,0,0,10);
  }
  if (E) {
     square.printBorder(0,10,10,10);
  }
  if (S) {
     square.printBorder(10,0,10,10);
  }
  if (W) {
     square.printBorder(0,0,10,0);
  }
}

يمكن أن تعمل بشكل جيد، لكنني أعتقد أنه ليس أنيقا للغاية، فهو كثير جدا إذا، وكل العبارات أكثر أو أقل. أعتقد أنه يجب أن يكون هناك طريقة لتبسيط هذه الرموز، أي اقتراحات؟

هل كانت مفيدة؟

المحلول

شخصيا، أنا حقا أحب المقارنات الثنائية.

const uint NORTH = 1;
const uint SOUTH = 2;
const uint EAST = 4;
const uint WEST = 8;

// ... some code ...
printBorder(NORTH + EAST);
// ... some other code ...

printBorder(uint Sides)
{
   if((NORTH & Sides) > 0) square.printBorder(0, 0, 0, 10);
   if((SOUTH & Sides) > 0) square.printBorder(0, 10, 10, 10);
   if((EAST & Sides) > 0) square.printBorder(10, 0, 10, 10);
   if((WEST & Sides) > 0) square.printBorder(0, 0, 10, 0);
}

قد يقول البعض أن هذا يجعل الكود داخل الوظيفة أقل قابلية للقراءة. ومع ذلك، فإن تفكيري لا يوجد سوى حدوث واحد لهذه الوظيفة في حين أنك ستدعو هذه الوظيفة في كل مكان. إذا كنت تعمل من خلال بعض الرمز، فأنت لم تنظر إليها في لحظة أكثر قابلية للقراءة؟

printBorder(true, false, true, true);

أو

printBorder(NORTH + SOUTH + EAST);

رأيي فقط. :)

نصائح أخرى

طريقة واحدة لتبسيطها ... إجراء مكالمات حتى لو كنت لا تحتاج إليها، ولكنها تطبيح على التنفيذ:

printBorder(N, E, S, W){
  square.printBorder(n, 0,0,0,10);
  square.printBorder(e, 0,10,10,10);
  square.printBorder(s, 10,0,10,10);
  square.printBorder(w, 0,0,10,0);
}

ثم في Square (أو أيا كان):

printBorder(condition, top, left, bottom, right) {
  if (!condition) {
    return;
  }
  printBorder(top, left, bottom, right);
}

بديل مماثل هو الحفاظ على الشرط printBorder مع الوظيفة الأصلية:

printBorder(N, E, S, W){
  printBorder(n, 0,0,0,10);
  printBorder(e, 0,10,10,10);
  printBorder(s, 10,0,10,10);
  printBorder(w, 0,0,10,0);
}

printBorder(condition, top, left, bottom, right) {
  if (!condition) {
    return;
  }
  square.printBorder(top, left, bottom, right);
}

لن يهمني IFS. أود فقط أن أجعلها قابلة للقراءة:

printBorder(N, E, S, W){
  if(N) square.printBorder( 0,  0,  0, 10);
  if(E) square.printBorder( 0, 10, 10, 10);
  if(S) square.printBorder(10,  0, 10, 10);
  if(W) square.printBorder( 0,  0, 10,  0);
}

أولا، أنت بخير، وهذا يفعل بالضبط ما يعبر عنه، لا تقلق بشأن المساحة التي تستخدمها، ومعظم الحلول هنا مجرد المياه الموحلة.

إذا كنت ترغب حقا في "القيام"، فابحث عن شيء ما إذا كنت لا تستطيع نقل المعلمة الحدودية إلى المربع. يمكنك تحريك الحشو الحدودية (10 في مثالك في المربع)، ربما أيضا الحالة التي يجب إظهار الحدود، ثم استدعاء Square.PrintBOrders (). هذا يعتمد الكثير في السياق حيث تستخدم هذا.

ماذا عن:

square.printBorder(N|E|W?0:10, N|S|W?0:10, N?0:10, N|E|S?10:0);

أنت لم تحدد لغة البرمجة.

إذا كانت جافا، فيمكن للعادة تقديم بناء جملة قابلة للقراءة جيدة، واكتب السلامة، وكذلك الاستفادة من إمكانات مثبط بت فعالة لتنفيذ العفيفة.

بدلا من ذلك، يمكنك أيضا توفير توقيع طريقة Varargs، ولكن بعد ذلك، لا يمكنك التأكد من استدعاء طريقتك باستخدام PrintBorder (n، n)، والتي لا معنى لها حقا. باستخدام واجهة العفيفة لديك هذا الضمان.

  public class PrintBorder {

    //this is your method without the if's
    public static void printBorder(EnumSet<Sides> sides) {
        for (Sides side : sides) {
            side.print(square);
        }
    }

    //use it like this
    public static void main(String[] args) {
        printBorder(EnumSet.of(N, E)); //static import here
    }

    //declare an enum for the sides.
    public enum Sides {
        N(0, 0, 0, 10),
        E(0, 10, 10, 10),
        S(10, 0, 10, 10),
        W(0, 0, 10, 0);

        private final int x1;
        private final int y1;
        private final int x2;
        private final int y2;

        Sides(int x1, int y1, int x2, int y2) {
            this.x1 = x1;
            this.y1 = y1;
            this.x2 = x2;
            this.y2 = y2;
        }

        //this method could as well be in the Square class, would be cleaner
        public void print(Square s) {
            s.printBorder(x1, y1, x2, y2);
        }

    }

    //boilerplate here
    private static final Square square = new Square();

    private static class Square {
        public void printBorder(int x1, int y1, int x2, int y2) {
            //do something..
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top