Каков оптимизированный способ проверки обязательных полей на основе другого значения поля в Java? - PullRequest
0 голосов
/ 12 июля 2020

Я создаю приложение Spring Boot Rest, в котором я получаю информацию об игроке как JSON в запросе POST для сохранения в базе данных. Всего у нас есть 16 полей, но в будущем будет добавлено больше полей.

{
    "jerseyNumber": "1",
    "firstName": "Sachin",
    "lastName": "Tendulkar",
    "age": "35",
    "country": "India",
    "playerType": "Batsmen",
    "score": "101",
    "ballsFaced": "110",
    "strikeRate": "90",
    "fours": "15",
    "sixes": "1",
    "oversBowled": "",    '
    "runsGiven": "",
    "maidenOvers": "",
    "wicketsTaken": "",
    "economy": ""
  }

если playerType = Batsmen, ниже 11 полей являются обязательными, остальные поля, указанные c для боулера, могут быть пустыми / пустыми.

{
    "jerseyNumber": "1",
    "firstName": "Sachin",
    "lastName": "Tendulkar",
    "age": "35",
    "country": "India",
    "playerType": "Batsmen",
    "score": "101",
    "ballsFaced": "110",
    "strikeRate": "90",
    "fours": "15",
    "sixes": "1",
  }

если playerType = Bowler, ниже 11 полей являются обязательными.

{
    "jerseyNumber": "10",
    "firstName": "Zaheer",
    "lastName": "Khan",
    "age": "38",
    "country": "India",
    "playerType": "Bowler",
    "oversBowled": "10",    '
    "runsGiven": "39",
    "maidenOvers": "1",
    "wicketsTaken": "3",
    "economy": "3.9"
  }

Класс Pojo

public class CricketPlayer {
 private String jerseyNumber;
 private String firstName;
 private String lastName;
 private String age;
 private String country;
 private String playerType;
 private String score;
 private String ballsFaced;
 private String strikeRate;
 private String fours;
 private String sixes;
 private String oversBowled;
 private String runsGiven;
 private String maidenOvers;
 private String wicketsTaken;
 private String economy;


 // Getter Methods 
}

При получении запроса мне нужно выполнить проверку на основе значения playerType, 1) если в запросе json указаны все обязательные поля (не пустые или нулевые).

Также ниже необходимо проверить бизнес-валидации,

a) age => 18 and age <= 50
b) country is any value from (England, Australia, India, Srilanka, New Zealand, South Africa, Pakistan, Zimbabwe, West Indies, Bangladesh)
c) maidenOvers < oversBowled
d) wicketsTaken < 11
e) ballsfaced < =360
f) oversBowled <= 10

В дальнейшем количество обязательных полей может увеличиться до 25-30 полей. Я могу написать проверку с помощью оператора if else на основе значения типа игрока.

if(cricketPlayer.getPlayerType.equals("Batsmen")
{
// writelogic to check if all mandatory fields are not null or empty

} else if(cricketPlayer.getPlayerType.equals("Bowler")
{


}

Но несколько блоков if else не выглядят хорошо, если у нас есть более 20-25 обязательных полей для проверки. Каков оптимизированный и лучший подход, которому следует следовать в этом сценарии, чтобы его было легче читать и было легче добавлять или удалять любые проверки.

1 Ответ

0 голосов
/ 12 июля 2020

используйте Hash-Map. используйте интерфейс Validator ->, который затем может иметь разные реализации -> BatsmanValidator & BowlerValidator. Вы также можете абстрагироваться от общих черт и проверять их с помощью одного класса, например PlayerValidator.

Интерфейс и класс

Interface Validator {
  public boolean validate(Player pojo);
}

class BatsmanValidator implements Validator {
  public boolean validate(Player pojo) {
  // code to validate a batsman 
  }
}

Использование

// setup validator
// Also, the player type should go in as enum.
Map<PlayerType, Validator> validators = new HashMap<>();
validators.put(Batsman, new BatsmanValidator());
validator.put(Bowler, new BowlerValidator());

// validate input
// This will itself validate the player based on type
// no if-else needed
validators.get(player.getType()).validate(player);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...