I am developing a game for a company. I will only develop this game for 2 months. My company ask me to make my code clean and extendable so they can hire another programmer when they need to add more features. I have read Clean Code by Uncle Bob. I found it really hard to put some of the concept into practice. This is one of my class
public class MenuScreen extends ScreenAdapter {
private final Game game;
private Stage stage;
private Actor groundActor;
private Actor skyActor;
private Actor titleActor;
private Actor playbtnActor;
private Actor optionbtnActor;
public MenuScreen(Game _game) {
this.game = _game;
}
@Override
public void show() {
this.stage = new Stage(new ScreenViewport());
createGround();
createSky();
createTitle();
createPlayButton();
createOptionButton();
setupStage();
Gdx.input.setInputProcessor(this.stage);
}
public void createGround() {
TextureRegion groundTextureRegion = Assets.instance
.getTextureRegionByName("bg-ground");
this.groundActor = new SRActor(groundTextureRegion);
this.groundActor.setPosition(0, 0);
}
public void createSky() {
TextureRegion skyTextureRegion = Assets.instance
.getTextureRegionByName("bg-sky");
this.skyActor = new SRActor(skyTextureRegion);
this.skyActor.setPosition(0, 0);
}
public void createTitle() {
TextureRegion titleTextureRegion =
Assets.instance.getTextureRegionByName("etc-gametitlebanner");
this.titleActor = new SRActor(titleTextureRegion);
int bottomLeftX = (int) ((Gdx.graphics.getWidth() - this.titleActor
.getWidth()) / 2);
int bottomLeftY = (int) Math.floor(0.6 * this.groundActor.getHeight());
this.titleActor.setPosition(bottomLeftX, bottomLeftY);
}
public void createPlayButton() {
TextureRegion playbtnTextureRegion =
Assets.instance.getTextureRegionByName("etc-playbtn");
this.playbtnActor = new SRActor(playbtnTextureRegion);
int bottomLeftX = (int) (0.01 * this.playbtnActor.getWidth())
+ (Gdx.graphics.getWidth() - (int) this.playbtnActor.getWidth())
/ 2;
int bottomLeftY = (int) (this.titleActor.getY() + 0.25 * this.titleActor
.getHeight());
this.playbtnActor.setPosition(bottomLeftX, bottomLeftY);
}
public void createOptionButton() {
TextureRegion optionbtnTextureRegion = Assets.instance
.getTextureRegionByName("etc-optionbtn");
this.optionbtnActor = new SRActor(optionbtnTextureRegion);
int bottomLeftX = (int) (0.01 * this.optionbtnActor.getWidth())
+ (Gdx.graphics.getWidth() - (int) this.optionbtnActor
.getWidth()) / 2;
int bottomLeftY = (int) (this.titleActor.getY() + 0.05 * this.titleActor
.getHeight());
this.optionbtnActor.setPosition(bottomLeftX, bottomLeftY);
}
public void setupStage() {
this.stage.addActor(this.skyActor);
this.stage.addActor(this.groundActor);
this.stage.addActor(this.titleActor);
this.stage.addActor(this.playbtnActor);
this.stage.addActor(this.optionbtnActor);
}
@Override
public void render(float delta) {
this.stage.act(Gdx.graphics.getDeltaTime());
this.stage.draw();
}
@Override
public void resize(int width, int height) {
this.stage.getViewport().update(width, height, true);
}
@Override
public void hide() {
dispose();
}
@Override
public void dispose() {
this.stage.dispose();
}
}
My question is does this class violates Single Responsibility Principle? Do i need to seperate every actor to its own class? And if so how should i refactor my code?
This seems okay to me. If all your different actors there have the same behaviour and are only different in their used texture, size, position etc, then having a single SRActor
with different attributes seems appropriate.
However I would advice you to use the static factory pattern and move the generation to another class. So you would only do stage.addActor(SRActorFactory.createOptionButton())
for example.