成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

二進制在互聯網業務開發中的精妙應用

開發 前端
我們可以通過枚舉實現,每個枚舉包含2個屬性——標識、場景,通過標識來判斷活動是否能在該場景中使用。

背景

在互聯網業務開發中,我們經常有這樣的一個場景,比如有一個活動,這個活動可以是一個紅包的活動,也可以是一個優惠券活動,也可以是一個秒殺活動等等,要求這個活動只能在某些場景下使用。

例子:

  • 如京東上面有很多優惠券,
  • 有的優惠券只能在京東上使用,
  • 有的優惠券只能在京東7Fresh上使用,
  • 有的優惠券只能在京東、京東7Fresh上使用。

我們立馬能想到一個方案,就是新增一個活動類型字段activityType,通過這個字段來區分這些活動。

那么如何統一、高效、可擴展地存儲這個活動標識,以便后續通過這個標識,來判斷這個活動能否在特定的某些場景中使用呢?

方案一

我們可以通過枚舉實現,每個枚舉包含2個屬性——標識、場景,通過標識來判斷活動是否能在該場景中使用。

1.存儲標識

如只能在京東上使用的標識為1,只能在淘寶特價版上使用的標識為3,等等。

package com.example.activitytype.constants;

/**
* 活動類型枚舉
*
* @author hongcunlin
*/
public enum ActivityType {
/**
* 京東
*/
JD(1, "京東"),

/**
* 京東極速版
*/
JDJSB(2, "京東極速版本"),

/**
* 京東極速版
*/
JD_JDJSB(3, "京東、京東極速版本");

/**
* 標識
*/
public Integer code;

/**
* 場景
*/
public String desc;

/**
* 枚舉
*
* @param code 標識
* @param desc 場景
*/
ActivityType(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
}

枚舉里邊列舉幾個活動的類型對應的標識,當然這個標識的數據類型,也可以為字符串,這里簡單采用整數來實現。

2.判斷使用

上面是基礎,都是為下面的服務提供數據支撐而已,下面的服務才是我們要直面的業務,如判斷這個活動能否在京東極速版上使用,我們的實現方案對應為:

package com.example.activitytype.service.impl;

import com.example.activitytype.constants.ActivityType;
import com.example.activitytype.service.ActivityTypeService;
import org.springframework.stereotype.Service;

/**
* 活動服務
*
* @author hongcunlin
*/
@Service
public class ActivityTypeServiceImpl implements ActivityTypeService {
/**
* 能否在京東極速版使用
*
* @param code 標識
* @return true能/false不能
*/
@Override
public boolean isCanUseInJdjsb(Integer code) {
return ActivityType.JDJSB.code.equals(code) ||
ActivityType.JD_JDJSB.code.equals(code);
// TODO 后續這里需要不斷維護
}
}

3.代碼測試

測試結果和我們預期的一樣

package com.example.activitytype;

import com.example.activitytype.service.ActivityTypeService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

@SpringBootTest
class ActivityTypeTest {
/**
* 活動服務
*/
@Resource
private ActivityTypeService activityTypeService;

/**
* 能否在京東極速版使用測試
*/
@Test
void isCanUseInJdjsbTest() {
// 1,京東,false
System.out.println(activityTypeService.isCanUseInJdjsb(1));
// 2,京東極速版本,true
System.out.println(activityTypeService.isCanUseInJdjsb(2));
// 3,京東、京東極速版本,true
System.out.println(activityTypeService.isCanUseInJdjsb(3));
}
}

4.評價

這個方案的優點就是前期實現起來很簡單。

缺點就是隨著維護的活動類型越來越多,我們需要補充很多判斷語句,并且每新增1種活動類型我們需要把涉及的方法都改一遍,這對我們開發人員來說,是完全不可接受的。

方案二

我們可以通過二進制字符串01來存儲這些場景,0代表不能使用,1代表能使用,后續我們通過判斷二進制字符串的某個位置的值是否為1,就可以輕松判斷是否能在這個場景使用了。

1.存儲位置

我們的枚舉,由一個籠統標識,改為存儲二進制的位置。

package com.example.activitytype.constants;

/**
* 活動類型枚舉
*
* @author hongcunlin
*/
public enum ActivityIndex {
/**
* 001
* 京東
*/
JD(1, "京東"),

/**
* 010
* 京東極速版
*/
JDJSB(2, "京東極速版本"),

/**
* 100
* 京東七鮮
*/
JD7F(4, "7Fresh");

/**
* 位置
*/
public Integer index;

/**
* 場景
*/
public String desc;

/**
* 枚舉
*
* @param index 位置
* @param desc 場景
*/
ActivityIndex(Integer index, String desc) {
this.index = index;
this.desc = desc;
}
}

如下圖所示,只能能在京東極速版使用的標識,我們存儲為2(二進制為010),通過判斷第2位是否為1,就可以判斷是否只能在京東極速版使用了。

2.判斷使用

根據所在位為1,即可判斷能否在該場景下使用

package com.example.activitytype.service.impl;

import com.example.activitytype.constants.ActivityIndex;
import com.example.activitytype.service.ActivityIndexService;
import org.springframework.stereotype.Service;

/**
* 活動服務
*
* @author hongcunlin
*/
@Service
public class ActivityIndexServiceImpl implements ActivityIndexService {
/**
* 能否在京東極速版使用
*
* @param code 標識
* @return true能/false不能
*/
@Override
public boolean isCanUseInJdjsb(Integer code) {
// 使用 位運算 判斷 值的二進制 指定位是否為1
return (code & ActivityIndex.JDJSB.index) != 0;
}
}

這里采用了位運算,簡單高效。

3.代碼測試

代碼的運行結果,和我們預期的一樣

package com.example.activitytype;

import com.example.activitytype.service.ActivityIndexService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

@SpringBootTest
class ActivityIndexTest {
/**
* 活動服務
*/
@Resource
private ActivityIndexService activityIndexService;

/**
* 能否在京東極速版使用測試
*/
@Test
void isCanUseInJdjsbTest() {
// 010,true
System.out.println(activityIndexService.isCanUseInJdjsb(2));
// 111,true
System.out.println(activityIndexService.isCanUseInJdjsb(7));
// 100,false
System.out.println(activityIndexService.isCanUseInJdjsb(4));
// 001,false
System.out.println(activityIndexService.isCanUseInJdjsb(1));
}
}

4.評價

我們枚舉的存儲,不像方案一中存在冗余的特征,如JDJSB、JD_JDJSB存在交集JDJSB,這是不符合編程中的OOP思想的。

此外,我們通過位運算判斷,速度更快,也就是說性能更好。

最后,我們的代碼后續隨著活動類型的新增,無需開發,也就是維護性更好。

最后

本文中的案例代碼已經上傳到github了,有需要同學可以自行下載

??https://github.com/larger5/activity-type-index??

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2023-09-20 00:02:33

C++14二進制字面量

2017-04-11 10:48:53

JS二進制

2020-04-29 12:49:33

邊緣計算云計算大數據

2022-07-18 09:01:15

SwiftApple二進制目標

2009-02-27 09:37:33

Google二進制代碼

2015-06-24 15:35:54

2016-12-05 13:22:15

互聯網移動互聯網物聯網

2015-05-28 16:11:07

互聯網+

2019-07-18 16:10:39

半導體技術系統

2022-03-05 23:15:38

大數據數據分析互聯網

2015-09-09 14:24:14

2020-12-31 09:24:27

互聯網存款業務互聯網金融

2020-05-06 09:51:37

二進制Linux命令行工具

2010-10-13 15:45:23

MySQL二進制日志

2018-08-15 09:02:59

產業互聯網工業互聯網物聯網

2018-03-22 07:06:20

互聯網互聯網++互聯網

2012-06-14 10:08:54

定制化服務器

2025-01-26 10:21:54

2018-10-22 14:37:16

二進制數據存儲

2022-10-31 08:02:42

二進制計算乘法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品久久久久久 | 日韩欧美一区二区三区在线播放 | 中文字幕一区二区三区在线观看 | 中国一级特黄视频 | 亚洲免费在线 | 国产一区二区视频在线 | 亚洲视频 欧美视频 | 男人av在线 | 成人性生交大片免费看r链接 | 亚洲精品免费视频 | 国产成人精品一区二 | 国产精品a久久久久 | 午夜码电影 | 免费黄色录像片 | 成人av播放| 欧美二区在线 | 色婷婷精品国产一区二区三区 | 在线视频亚洲 | 亚洲综合一区二区三区 | www.亚洲精品| 欧美日韩精品久久久免费观看 | 欧美一区二区在线观看视频 | 久久欧美精品 | 青青久在线视频 | 亚洲中午字幕 | 国产日韩欧美一区二区 | 久久久久国产一区二区三区 | 亚洲网站在线观看 | 在线天堂免费中文字幕视频 | 成人在线播放网址 | 国产精品久久久久久久久久免费看 | 久久久久久久久久久福利观看 | 亚洲精品一区二区三区蜜桃久 | 国产精品欧美一区二区 | 91久久久久久 | 青青操91 | 亚洲综合一区二区三区 | 中文字幕一二三 | 一级a性色生活片久久毛片 午夜精品在线观看 | 国产精品高潮呻吟 | www.青青草 |