Bu nasıl kod geliştirmek için? (Eğer çok fazla)

oy
1

Ben kare sınırını yazdırmak istiyorum ... Bu sadece bir tarafı ya da karenin fazla tarafını yazdırmak olabilir, o yüzden bu yöntemi yazdım

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);
  }
}

Bu iyi çalışır, ama ben o kadar zarif olmadığını düşünüyorum, bu takdirde çok fazla olduğunu ve her deyimi az ya da çok aynı. Bu kodlar, herhangi bir öneri basitleştirmek için bir yol var olmalı sence?

Oluştur 08/08/2009 saat 08:52
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
5

Gerek, ancak uygulama conditionalise olmasa bile o ... çağrı yapmak basitleştirilmesi bir yolu:

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);
}

Sonra içinde Square(her ne ya):

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

Benzer bir alternatif şartlı tutmak olacaktır printBorderorijinal fonksiyonu ile:

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);
}
Cevap 08/08/2009 saat 09:00
kaynak kullanıcı

oy
5

Ben eğer'siz umurumda olmaz. Sadece daha okunabilir yapmak istiyorum:

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);
}
Cevap 08/08/2009 saat 09:03
kaynak kullanıcı

oy
3

Şahsen, gerçekten ikili karşılaştırmalar gibi.

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);
}

Bazıları bu daha az okunabilir işlevi içinde kod yapar söylenebilir. Ancak, benim düşünce biryere bu fonksiyonu çağırarak olacak oysa bu işlevin sadece tek bir olay olmasıdır. Bazı kod üzerinden çalıştırıyorsanız daha okunabilir bir süre içinde bakmadım?

printBorder(true, false, true, true);

veya

printBorder(NORTH + SOUTH + EAST);

Sadece benim düşüncem. :)

Cevap 08/08/2009 saat 09:26
kaynak kullanıcı

oy
3

Önce Tamam yapıyoruz, bu tam olarak ifade şeyi,, çözümlerin çoğu burada Çamurlu suyu kullandığınız alanın dert etmeyin gelmez.

Gerçekten kare içine Sınır parametresini hareket edemez eğer bir şey bakmak 'do' istiyorum. muhtemelen de, (karenin içine örnekte 10) sınır gösterilmesi gereken Devleti sınır dolgu taşıyabilir ve sonra sadece square.printBorders diyebiliriz (). Yani bu kullandığınız bağlamda çok bağlıdır.

Cevap 08/08/2009 saat 14:14
kaynak kullanıcı

oy
1

Hangi programlama dilini belirtmedi.

o java olsaydı, çeteleler iyi okunabilir sözdizimi, tip güvenliği sağlamak, hem de EnumSet uygulamasının verimli bit işe yaramaz yeteneklerinden yararlanabilir.

Alternatif olarak aynı zamanda bir varargs yöntemi imza sağlayabilir, ancak o zaman yöntem gerçekten mantıklı değil printBorder (N, N) ile adı verilecek emin olamaz. EnumSet arayüzünü kullanarak bu garanti var.

  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..
        }
    }
}
Cevap 08/08/2009 saat 14:49
kaynak kullanıcı

oy
3

Nasıl hakkında:

square.printBorder(N|E|W?0:10, N|S|W?0:10, N?0:10, N|E|S?10:0);
Cevap 08/08/2009 saat 14:53
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more