Простой шаблон завод в Scala (пытается ограничить использование новых)


Я новичок в Scala и пытается улучшить свои навыки. Я решил быть игривым о нем и работать, чтобы сделать преобразования игры spaceinvaders поставляется с LWJGL. Он состоит из 10 классов Java, которые я загрузил, составленный и успешно бежал из Eclipse.

Моя первая Скала шаг-заменить класс Sprite.java с SpriteNew.класс скала. Я закончил первый проход (см. ниже). Однако, у меня несколько вопросов:

  1. Как мне сделать класс SpriteNew только экземпляры, созданные по статьям SpriteNew.создать? В Java, я бы просто сделать конструктор частная. Так как я не могу сделать это, я интересно, если я пропавших без вести, как Я должен подойти к проблеме, как это отличается от того, как я сделать это с Java.
  2. В объект SpriteNew, я не как, как я использовал VAR для временно определить поле, так что я могу ссылка/вернуть его в последней строке метода load. Есть какие-либо более эффективные способы, чтобы написать это способ держать намерение изолируя Ява/нуль-Несс/исключение-Несс?

Любая обратная связь, коучинг, рекомендации, предложения, которые вы можете дать мне на это будет принята с благодарностью.

Для краткости, я лишила комментарии из оригинала Sprite.java класс (идите сюда , если вы хотели бы видеть немодифицированный исходный код для Sprite.java):

package org.lwjgl.examples.spaceinvaders;

import java.io.IOException;

import static org.lwjgl.opengl.GL11.*;

public class Sprite {

    private Texture texture;

    private int         width;

    private int         height;

    public Sprite(TextureLoader loader, String ref) {
        try {

            texture = loader.getTexture(ref);
            width = texture.getImageWidth();
            height = texture.getImageHeight();
        } catch (IOException ioe) {
            ioe.printStackTrace();
            System.exit(-1);
        }
    }

    public int getWidth() {
        return texture.getImageWidth();
    }

    public int getHeight() {
        return texture.getImageHeight();
    }

    public void draw(int x, int y) {
        glPushMatrix();

        texture.bind();

        glTranslatef(x, y, 0);

        glBegin(GL_QUADS);
        {
            glTexCoord2f(0, 0);
            glVertex2f(0, 0);

            glTexCoord2f(0, texture.getHeight());
            glVertex2f(0, height);

            glTexCoord2f(texture.getWidth(), texture.getHeight());
            glVertex2f(width, height);

            glTexCoord2f(texture.getWidth(), 0);
            glVertex2f(width, 0);
        }
        glEnd();

        glPopMatrix();
    }
}

И вот мой первый пропуск по версии Scala как на заводе (используя оба предмета и класса):

package org.lwjgl.examples.spaceinvaders

import java.io.IOException
import org.lwjgl.opengl.GL11._

object SpriteNew {
  def create (textureLoader: TextureLoader, resourceName: String): SpriteNew = {
    def load: Texture = {
      var texture: Texture = null
      try {
        texture = textureLoader.getTexture(resourceName)
      }
      catch
      {
        case ioe: IOException => {
          println(ioe.getStackTraceString)
          System.exit(-1)
        }
      }
      texture
    }

    val texture = load
    new SpriteNew(texture)
  }
}

class SpriteNew (val texture: Texture) {
  val width = texture.getImageWidth()
  val height = texture.getImageHeight()
  def draw(x: Int, y: Int) {
    glPushMatrix
      texture.bind()
      glTranslatef(x, y, 0)
      glBegin(GL_QUADS)
        glTexCoord2f(0, 0)
        glVertex2f(0, 0)

        glTexCoord2f(0, texture.getHeight())
        glVertex2f(0, height)

        glTexCoord2f(texture.getWidth(), texture.getHeight())
        glVertex2f(width, height);

        glTexCoord2f(texture.getWidth(), 0)
        glVertex2f(width, 0)
      glEnd
    glPopMatrix
  }
}

Обновления (2011/ноя/22 - 15:00 ЦДТ):

Я неправ в вопросе 1 о не будучи в состоянии сделать конструктор приватным. Размещение ключевое слово "частная" после имени класса Scala и до списка параметров конструктора данном классе остаются, а конструктор становится закрытым. Другими словами, фрагмент выше "класса SpriteNew (Валь текстуры: текстуры) {" будут изменены, чтобы стать "класса SpriteNew частная (Валь текстуры: текстуры) {"



477
1
задан 22 ноября 2011 в 06:11 Источник Поделиться
Комментарии
1 ответ

Вопрос 1: Вы ответили на него сами.

Вопрос 2: попробовать / поймать в Scala это выражение. Кроме того, представление sys.выход - это типа ничего, что тип, подтип любого другого типа, поэтому он не нарушит тип вывода. Так что ваши создать метод может быть

  def create (textureLoader: TextureLoader, resourceName: String) = new SpriteNew (
try textureLoader.getTexture(resourceName)
catch { case ioe: IOException =>
println(ioe.getStackTraceString)
sys.exit(-1)
}
)

Кроме того, было бы более привычно использовать применить для создания имя метода (а не создать), так что вы можете сделать новый экземпляр с SpriteNew(а, б).

Мне нравится, чтобы избежать впустую вертикальное пространство в мой макет. Это не здорово, если тебе платят строк кода написано, но ИМО это гораздо легче увидеть, что происходит, если код не все разложили, и вы можете поместить больше на странице, поэтому вам не придется прокручивать назад и вперед.

3
ответ дан 24 ноября 2011 в 04:11 Источник Поделиться