Правильная схема для использования
Я хотел бы спросить, какую правильную диаграмму UML использовать для этого моего проекта. Это приложение для Android. Диаграммы UML:
- диаграмма классов
- диаграмма объекта
- схема использования
- схема последовательности
- схема сотрудничества
- диаграмма состояний
- диаграмма деятельности
- схема компонентов
- схема развертывания
Вот код приложения для Android (это Tictactoe игра):
MainActivity.java
package com.example.sample;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
public class MainActivity extends Activity {
// Representing the game state:
private boolean noughtsTurn = false; // Who's turn is it? false=X true=O
private char board[][] = new char[3][3]; // for now we will represent the board as an array of characters
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupOnClickListeners();
resetButtons();
}
/**
* Called when you press new game.
*
* @param view the New Game Button
*/
public void newGame(View view) {
noughtsTurn = false;
board = new char[3][3];
resetButtons();
}
/**
* Reset each button in the grid to be blank and enabled.
*/
private void resetButtons() {
TableLayout T = (TableLayout) findViewById(R.id.tableLayout);
for (int y = 0; y < T.getChildCount(); y++) {
if (T.getChildAt(y) instanceof TableRow) {
TableRow R = (TableRow) T.getChildAt(y);
for (int x = 0; x < R.getChildCount(); x++) {
if (R.getChildAt(x) instanceof Button) {
Button B = (Button) R.getChildAt(x);
B.setText("");
B.setEnabled(true);
}
}
}
}
TextView t = (TextView) findViewById(R.id.TextView);
t.setText(R.string.TextView);
}
/**
* Method that returns true when someone has won and false when nobody has.<br />
* It also display the winner on screen.
*
* @return
*/
private boolean checkWin() {
char winner = '\0';
if (checkWinner(board, 3, 'X')) {
winner = 'X';
} else if (checkWinner(board, 3, 'O')) {
winner = 'O';
}
if (winner == '\0') {
return false; // nobody won
} else {
// display winner
TextView T = (TextView) findViewById(R.id.TextView);
T.setText(winner + " wins");
return true;
}
}
/**
* This is a generic algorithm for checking if a specific player has won on a tic tac toe board of any size.
*
* @param board the board itself
* @param size the width and height of the board
* @param player the player, 'X' or 'O'
* @return true if the specified player has won
*/
private boolean checkWinner(char[][] board, int size, char player) {
// check each column
for (int x = 0; x < size; x++) {
int total = 0;
for (int y = 0; y < size; y++) {
if (board[x][y] == player) {
total++;
}
}
if (total >= size) {
return true; // they win
}
}
// check each row
for (int y = 0; y < size; y++) {
int total = 0;
for (int x = 0; x < size; x++) {
if (board[x][y] == player) {
total++;
}
}
if (total >= size) {
return true; // they win
}
}
// forward diag
int total = 0;
for (int x = 0; x < size; x++) {
for (int y = 0; y < size; y++) {
if (x == y && board[x][y] == player) {
total++;
}
}
}
if (total >= size) {
return true; // they win
}
// backward diag
total = 0;
for (int x = 0; x < size; x++) {
for (int y = 0; y < size; y++) {
if (x + y == size - 1 && board[x][y] == player) {
total++;
}
}
}
if (total >= size) {
return true; // they win
}
return false; // nobody won
}
/**
* Disables all the buttons in the grid.
*/
private void disableButtons() {
TableLayout T = (TableLayout) findViewById(R.id.tableLayout);
for (int y = 0; y < T.getChildCount(); y++) {
if (T.getChildAt(y) instanceof TableRow) {
TableRow R = (TableRow) T.getChildAt(y);
for (int x = 0; x < R.getChildCount(); x++) {
if (R.getChildAt(x) instanceof Button) {
Button B = (Button) R.getChildAt(x);
B.setEnabled(false);
}
}
}
}
}
/**
* This will add the OnClickListener to each button inside out TableLayout
*/
private void setupOnClickListeners() {
TableLayout T = (TableLayout) findViewById(R.id.tableLayout);
for (int y = 0; y < T.getChildCount(); y++) {
if (T.getChildAt(y) instanceof TableRow) {
TableRow R = (TableRow) T.getChildAt(y);
for (int x = 0; x < R.getChildCount(); x++) {
View V = R.getChildAt(x); // In our case this will be each button on the grid
V.setOnClickListener(new PlayOnClick(x, y));
}
}
}
}
/**
* Custom OnClickListener for Noughts and Crosses<br />
* Each Button for Noughts and Crosses has a position we need to take into account
*
* @author Lyndon Armitage
*/
private class PlayOnClick implements View.OnClickListener {
private int x = 0;
private int y = 0;
public PlayOnClick(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public void onClick(View view) {
if (view instanceof Button) {
Button B = (Button) view;
board[x][y] = noughtsTurn ? 'O' : 'X';
B.setText(noughtsTurn ? "O" : "X");
B.setEnabled(false);
noughtsTurn = !noughtsTurn;
// check if anyone has won
if (checkWin()) {
disableButtons();
}
}
}
}
}
2 ответа
- Диаграмма вариантов использования для определения объема.
- Конечный автомат / схема для определения логики использования
- Схема пакета для начала планирования размещения классов и источников
- Диаграммы классов для классов, поддерживающих логику
- Диаграммы последовательности для используемых алгоритмов
- Составные структурные схемы для планирования сложных классов.
Если какая-то диаграмма абсолютно очевидна, вам не нужно это делать.
Но! ПОСЛЕ кодирования вам уже не нужны диаграммы, скорее хорошие javadocs.
Если это не ваш код, и вы хотите понять его, диаграммы могут помочь. Начните с рисования более простых и переходите к ним, вы понимаете худшее.
Для случая, когда он является вашим кодом, и вы хотите изменить его, нарисуйте схемы для концепций, которые вы хотите реорганизовать.
Правильный тип UML-диаграммы, который вам нужно использовать, зависит от того, что вам нужно передать, и от того, кто является вашей целевой аудиторией.
Например: 1) Если вам нужно показать действия на уровне процесса (на высоком уровне), я бы рекомендовал использовать Диаграммы действий. Они хороши для общения как с техническими специалистами, так и с аналитиками и пользователями.
2) Если вы хотите показать, как происходит поток на уровне объекта, диаграммы последовательности будут более подходящими. Целевой аудиторией в этом случае будут разработчики.
Дайте нам знать намерение, и мы можем быстро помочь вам с наиболее актуальным ответом.