Если кто-то посмеет использовать Map для передачи параметров, я был JIO.

Java
Если кто-то посмеет использовать Map для передачи параметров, я был JIO.

image


Помните, когда я в последний раз писал статью о многоуровневом коде и планировании реальных проектов?«После прочтения этого, структура проекта с открытым исходным кодом других людей должна быть в состоянии понять», В конце статьи упоминаются некоторые предостережения, первое из которых:

  • Не рекомендуется использовать HashMap для передачи параметров на уровне контроллера, а рекомендуется использовать определение модели данных.

В частном письме многие друзья спрашивали, почему мы не можем этого сделать?

Я втайне задумался в душе: не избиты ли сослуживцы тех маленьких друзей, которые это сделали? (смешной)

Да ладно, давайте поговорим об этом сегодня, это проблема, которую часто упускают из виду при написании кода.


Это тоже кто-то написал?

Однажды я взялся за старый проект, оставленный моими предшественниками, и в тот момент, когда я получил код и импортировал его в IDEA, я расплакался.

image

потому что этоControllerКод слоя записывается так:

@RestController
@RequestMapping("/index")
public class IndexController {

    // 获取App首页内容
    @PostMapping("/getIndexContent")
    public ResponseWrapper getIndexContent( @RequestBody Map<String, Object> paramMap ) {

        ResponseWrapper res = new ResponseWrapper();

        // 下面开始做传参有效性的校验
        if (!paramMap.containsKey("article_id")) {
            res.setCode(500);
            res.setMsg("缺少 article_id 信息");
            return res;
        }

        if (!paramMap.containsKey("page")) {
            res.setCode(500);
            res.setMsg("缺少 page 信息");
            return res;
        }

        if (!paramMap.containsKey("size")) {
            res.setCode(500);
            res.setMsg("缺少 size 信息");
            return res;
        }

        if (!paramMap.containsKey("version")) {
            res.setCode(500);
            res.setMsg("缺少 version 信息");
            return res;
        }

        // ...... 此处省略

    }

    // ...... 此处省略

}

Не скажем больше ничего, но мы наглоControllerиспользуется в методе слоевMapПередать ссылку? ! Просто безумие. К счастью, еще идет волна проверки валидности переданных параметров.Я могу угадать переданные параметры, иначе было бы совсем мяу.

Далее, давайте хорошо поболтаем:почему нетControllerИспользуется для передачи параметров слояMapтип!


Карта крутая какое-то время, обслуживание крутое

Ну вот и живой пример нашего маленького друга.

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

image

Ты видел!

использоватьMapПрошедшийПервый(Слишкомсамый большой) Недостаток: это вызовет у человека, который его принимает и поддерживает, сомнения в собственной жизни, потому что он вообще не знает, какие параметры передаются в коде, и если он захочет сконструировать параметры для отладки интерфейса, он можно полагаться только наМозговой тоник,Слепой,а такжепредполагать.

Только представьте, на самом деле мы можем использовать параметры в любом месте нашего кода.MapДа ладно, если это сделано, то не нужно определять в коде какие-либо классы модели данных, если да, то можем ли мы понять такой код?

И проект, который взял на себя этот маленький друг, на самом деле все еще используетсяLinkedHashMapПараметры можно сказать, что очень красиво.

image

В дополнение к этому последует следующая проблема.


Простые в использовании инструменты API больше не с вами

Я написал статью раньше«Фронтенд и бэкэнд разделены, пришло время создать полезную систему управления API! 》, я рассказал о некоторых более простых в использовании из представленных на рынке, которые могут значительно повысить эффективность фронтенд- и бэкэнд-разработки.Инструменты управления API, что является большим подспорьем для фронтенд- и бэкенд-разработки.

мы будем использоватьSwaggerЭтот инструмент API в качестве примера, еслиControllerиспользование параметровMapесли:

// 获取App首页内容
@ApiOperation("获取App首页内容")
@PostMapping("/getIndexContent")
public ResponseWrapper getIndexContent( @RequestBody Map<String, Object> paramMap ) {

    // ...... 此处省略

}

ноAPIИнструмент не может прочитать определенные элементы параметров и типы параметров, поэтому переданные параметры не видны:

image

Другими словами, если я поставлю вышеMapИзмените параметр на пользовательский класс модели данных.IndexQueryDtoЕсли вы сбылись:

// 获取App首页内容
@ApiOperation("获取App首页内容(改造后)")
@PostMapping("/getIndexContent")
public ResponseWrapper getIndexContent( @RequestBody IndexQueryDto indexQueryDto ) {

    // ...... 此处省略

}
@ApiModel(value = "App首页内容请求参数实体对象")
class IndexQueryDto {

    @ApiModelProperty(value = "文章ID号")
    @NotNull(message = "缺少 article_id 信息")
    private Long article_id;


    @ApiModelProperty(value = "页面数")
    @NotNull(message = "缺少 page 信息")
    private Integer page;

    @ApiModelProperty(value = "每页条目数")
    @NotNull(message = "缺少 size 信息")
    private Integer size;

    @ApiModelProperty(value = "App版本号")
    @NotNull(message = "缺少 version 信息")
    private String version;

    // ...... 此处省略set/get方法

}

похож наSwaggerэтоAPIИнструменты очень удобны, чтобы помочь нам управлять параметрами:

image

Таким образом, будет гораздо удобнее отлаживать самостоятельно или взаимодействовать с интерфейсом и сервером.


Аналогично, кромеSwaggerэтоAPIвне инструментов управления, как в моем предыдущем посте《Никогда не использовали эти плагины IDEA? Неудивительно, что писать код — головная боль».Очень полезный плагин управления интерфейсом, рекомендуемый вRestfulToolkitтоже не узнатьMapКонкретные параметры, которые содержит тип:

image

Однако для параметров определения модели данных можно четко указать детали параметров, и можно легко провести тест интерфейса:

image


Отличные аннотации нельзя использовать

Или возьмем пример кода в начале статьи, несмотря ни на что, ответственность все равно несет тот приятель, который писал этот код, ведь он добросовестно использует ручную сериализацию.if()Судя по тому, что проверка достоверности всех параметров завершена:

image

Но проблема в том, что нам очень нужен такой самодельный сериал с горячими глазами.if()Решение сделать проверку параметров?

image

то же, что и выше"Что? Я слышал, что вы до сих пор пишете от руки сложную проверку параметров? 》Как упоминалось выше, на самом деле мы можем избежать сложной проверки параметров с помощью аннотаций, но предпосылка заключается в том, что мы не можем использоватьMapТип параметров, вам нужно использовать определение модели данных, например:

class IndexQueryDto {

    @NotNull(message = "缺少 article_id 信息")
    private Long article_id;

    @NotNull(message = "缺少 page 信息")
    private Integer page;

    @NotNull(message = "缺少 size 信息")
    private Integer size;

    @NotNull(message = "缺少 version 信息")
    private String version;

    // ...... 此处省略get/set方法
}

ОдинNotNullАннотацию можно сделать, не правда ли вкусно?


Действительно ли параметры карты бесполезны?

Некоторые друзья сказали, что сMapПреимущество передачи параметров заключается в том, что ее можно расширять по желанию, а более поздние изменения гибки.Если вы хотите подключить к ней несколько параметров, вы можете подключить несколько параметров, а также избавляет от проблем с определением различных объектов. и именование.

image


Если вам нужно использовать Map для передачи параметров

Если неизбежно использованиеMapПроходящий женьшень, также Ма, пожалуйста, оборудуйтеПолный тестовый примерЧто ж, спасите людей, которые потом берут на себя обслуживание, каждый день глядя на код и сомневаясь в своей жизни.

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


тсс...

Ну, сказав все это, если ваш проектControllerКод слоя все еще используетсяMapЕсли ты передашь женьшень, обещай мне, больше ничего не говори, поторопись и тайком все переделай, поспеши! скорость! Беги вперед!

image