먼저이 글을 읽을 :
How to declare global variables in Android?
이제 정적 싱글 톤을 사용하지 않아야합니다. 싱글 톤을 사용하는 것은 전역 변수와 동일합니다. 전역 변수는 전역 변수를 사용하는 모든 곳에서 모듈성을 깨거나 전체적인 디자인에 대한 전체적인 세부 사항 및 가정을 소개하기 때문에 유지 관리 가능성을 감소시킵니다. 프로그램은 한 곳에서 찾기 때문에이 두 변수를 가질 수 없습니다. 이것은 하나가 아닌 두 개의 인스턴스가있을 때 프로그램이 쉽게 적응할 수 없음을 의미합니다. 예를 들어
, 나는 playTurn()라는 메서드가 있다고 나는 그렇게처럼 구현 :
public void playTurn() {
globalPlayer.incrementClock();
globalPlayer.doSomething();
globalPlayer.doSomethingElse();
}
지금의 내가 믹스에 두 번째 플레이어를 추가 할 가정 해 봅시다. 어, 내 playTurn() 메서드는 globalPlayer를 사용할 때만 한 명의 플레이어 만 사용합니다. 두 번째 플레이어를 프로그램에 추가하려면 해당 메서드를 변경해야합니다. 이 작업을 많이 수행하면 프로그램이 매우 엄격하고 변경하기가 쉽지 않습니다. 내가 이런 짓을하는 대신 어떤 경우 :
public void playTurn(Player player) {
player.incrementClock();
player.doSomething();
player.doSomethingElse();
}
지금이 작업을 수행 할 수 있습니다
playTurn(player1);
playTurn(player2);
둘 다 재생기 및 player2에 대한 playTurn()를 다시 사용할 수 있습니다 나는 그것을 변경할 필요가 없었습니다.방금 그 방법의 클라이언트를 변경해야했습니다.
대부분의 경우 게으르다가 일부 객체에 대한 참조를 얻고 자 할 때가 많으며, 전역 변수는 잘 알려진 객체에 대한 참조를 얻기위한 빠른 방법입니다. 대신 시작시 또는 그것이 의미있는 시간에 응용 프로그램의 종속성을 해결하는 하나의 클래스를 갖는 것이 더 좋습니다. 그런 다음 한 곳에서만 코드가 어떻게 결합되는지 이해합니다. 예 :
public class Game {
Player player1;
Player player2;
Board board;
public void startGame() {
BlueTooth blueTooth = BlueTooth.getChannel();
player1 = new LocalPlayer();
player2 = new NetworkedPlayer(blueTooth);
board = new Board();
player1.setOpponent(player2);
player1.setBoard(board);
player2.setOpponent(player1);
player2.setBoard(board);
}
}
이제 모든 사람이 자신의 종속성을 가지며 정적 변수를 사용하여 참조를 찾을 필요가 없습니다. 또한 player1은 네트워크를 통해 player2와 같은 세부 정보를 알 필요가 없으며 게임이 별개입니다. 주목해야 할 중요한 점은 우리가 연결하고있는 이러한 객체는 수명이 길며 프로그램 전체가 가능할 수도 있지만 런타임에 다른 것들을 만들어야하는 경우에도 괜찮습니다.
예를 들어 게임에 참여한 사람을 기반으로 런타임에 여러 플레이어를 만들어야합니다. 우리는 시작시 인스턴스화 할 수있는 PlayerManager를 생성 한 다음 즉시 Player 객체를 만들 수 있습니다. PlayerManager는 새로운 게임을 시작할 때 게임에서 만드는 단순한 오래된 객체입니다.
나는 이것이 소프트웨어를 개발하는 훨씬 더 좋은 방법임을 알기를 바랍니다. 당신은 그것을 바로 이해할 수 없을지 모르지만, 당신이 그것에 대해 생각한다면 그것은 더 이해 될 것입니다. 그것은 매우 미묘한 변화이지만 매우 강력합니다.
@ user23 :이 질문은 2 세 이상입니다. 질문이 있으면 새로운 질문을하십시오. – Falmarri