代码优化-第一弹扩展接口

python算法--密码验证合格程序 题目 密码要求: 1.长度超过8位 2.包括大小写字母.数字.其它符号,以上四种至少三种 3.不能长度大于2的不含公共元素子串重复 (注:其他符号不含空格或换行) 答案与解析 import sys import re for i in sys.stdin: i = i.strip() if len(i) <= 8: print('NG') else: sub = [] #最大重复子串长度2 for... 阅读详情

这两天写一些代码,发现有不少重复劳动,因此借此机会梳理下代码是怎样进化的,以密码验证位例。

密码验证规则:

1.长度超过8位。

2.包括大小写字母.数字.其它符号,以上四种至少三种。

3.不能有长度大于2的包含公共元素的子串重复。

这三种规则通常我们会写三个函数就可以搞定,见下。

package main

import "fmt"

func main(){
    var s string
    fmt.Scanf("%s", &s)
    ResStatus := "OK"
    if len(s) < 8 {
        ResStatus = "NG"
    } else if !incThreeVarChars(s) {
        ResStatus = "NG"
    } else if !existSubstrLessThann(s, 3) {
        ResStatus = "NG"
    }
    fmt.Println(ResStatus)
}

// 包含三种字符
func incThreeVarChars(s string)bool{
    tp := make(map[byte]bool)
    for _,v := range s {
        if isNumber(byte(v)) {
            tp['1'] = true
        } else if isEngUpperChar(byte(v)) {
            tp['2'] = true
        } else if isEngLowerChar(byte(v)) {
            tp['3'] = true
        } else {
            tp['4'] = true
        }
    }
    if len(tp) < 3 {
        return false
    }
    return true
}
// 是数字
func isNumber(a byte)bool{
    if a >= '0' && a <= '9' {
        return true
    }
    return false
}
// 是大写字母
func isEngUpperChar(a byte)bool{
    if a >= 'A' && a <= 'Z' {
        return true
    }
    return false
}
// 是小写字母
func isEngLowerChar(a byte)bool{
    if a >= 'a' && a <= 'z' {
        return true
    }
    return false
}
// 是否存在低于n个字符相同子串
func existSubstrLessThann(s string, n)bool{
    f := true
    if len(s) <= n {
        return f
    }
    for i := 0; i < len(s)-n;i++{
        s1 := s[i:i+n]
        for j := i+1; j < len(s)-n;j++{
            s2 := s[j:j+n]
            if s1 != s2 {
                continue
            }
            f = false
            break
        }
    }
    return f
}

如果现在需要对这个密码验证器扩展为需要返回错误提示,我们需要更改代码并对每种规则返回对应的错误,若规则比较多这中编码不符合代码的修改哲学。

这里我把它改为一个验证器,一个规则接口,以及具体实现三块,期中验证器三个方法,AddRule是添加规则,Valide是验证规则,Error是错误收集器。

type Validator struct{
    r []IRule
}

func New()*Validator{
	return &Validator{}
}

func (s *Validator)AddRule(r rule){
    s.r = append(s.r, r)
}

func (s *Validator)Valide(){
    for _,v := range s.r {
        if err := v.Valid(); err != nil {
            s.errs = append(s.errs, err)
        }
    }
}
func (s *Validator)Errors()[]error{
	return s.errs
}

规则接口只需要Valid方法,以及Rule规则具体error类型。

type IRule interface {
     Valid(interface)error
}

type Rule struct {
    err error
    IRule
}

规则实现1,包含至少3种字符。

// 包含三种字符
type moreThanThreeKindsCharactorRule struct {
	Rule
}
func (s *moreThanThreeKindsCharactorRule)Valid(s string)error{
    tp := make(map[byte]bool)
    for _,v := range s {
        if isNumber(byte(v)) {
            tp['1'] = true
        } else if isEngUpperChar(byte(v)) {
            tp['2'] = true
        } else if isEngLowerChar(byte(v)) {
            tp['3'] = true
        } else {
            tp['4'] = true
        }
    }
    if len(tp) < 3 {
        return errors.New("少于超过3种字符")
    }
    return nil
}
// 是数字
func (s *moreThanThreeKindsCharactorRule)isNumber(a byte)bool{
    if a >= '0' && a <= '9' {
        return true
    }
    return false
}
// 是大写字母
func (s *moreThanThreeKindsCharactorRule)isEngUpperChar(a byte)bool{
    if a >= 'A' && a <= 'Z' {
        return true
    }
    return false
}
// 是小写字母
func (s *moreThanThreeKindsCharactorRule)isEngLowerChar(a byte)bool{
    if a >= 'a' && a <= 'z' {
        return true
    }
    return false
}

规则实现2,存在超过n个字符的子串。


// 是否存在低于n个字符相同子串
type existSubstrLessThannRule struct{
	Rule
}
func (s *existSubstrLessThannRule)Valid(s string, n int)error{
    f := true
    if len(s) <= n {
        return f
    }
    for i := 0; i < len(s)-n;i++{
        s1 := s[i:i+n]
        for j := i+1; j < len(s)-n;j++{
            s2 := s[j:j+n]
            if s1 != s2 {
                continue
            }
            f = false
            break
        }
    }
	if !f {
		return errors.New("存在低于3个字符相同子串")
	}
    return nil
}

代码调用

func main(){
    var s string
    fmt.Scanf("%s", &s)
    ResStatus := "OK"
	validator := NewValidator()
	
	validator.AddRule(moreThanThreeKindsCharactorRule{})
	validator.AddRule(existSubstrLessThannRule{})
	validator.Valide()
	if errs := validator.Errors(); len(errs) > 0 {
        ResStatus = "NG"
	}
    fmt.Println(ResStatus)
}

这种方式减少了更改以往的代码,但每增加一种规则需要增加一个struct。

深入解析安卓性能分析工具systrace/atrace的使用技巧与实战场景 本文深入解析了安卓性能分析工具systrace/atrace的核心使用技巧与实战场景。文章澄清了环境搭建的常见误区,详细拆解了命令参数,并通过列表卡顿、启动优化等具体案例,手把手指导开发者利用这些工具精准定位性能瓶颈,提升应用流畅度。 阅读详情

相关推荐

CATIA二次开发核心技术:多实体零件自动化拆解与装配生成深度解析(零件转产品)

CATIA二次开发核心技术:多实体零件自动化拆解与装配生成深度解析

KE17RS的博客 2097

【每日一题】- 密码校验

密码要求:1.长度超过8位2.包括大小写字母.数字.其它符号,以上四种至少三种3.不能长度大于2包含公共元素子串重复 (注:其他符号不含空格或换行)数据范围:输入的字符串长度满足 1≤n≤100输入描述:一组字符串。输出描述:如果符合要求输出:OK,否则输出NG。

xuedong_1989的博客 607

基于MATLAB的太阳能二自由度跟踪系统建模与仿真.rar_太阳能 跟踪_太阳能自由度_太阳跟踪 Matlab

基于matlab的太阳能二自由度跟踪系统,亲测有效,欢迎大家下载。

前端基础知识与常见面试题(六)

开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。//在第n个(n>=3)台阶时,上一个台阶是n-1或者n-2,所以跳上n台阶的方法总数是n-1台阶方法总数和n-2台阶方法总数之和。所谓防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。,问你生命周期不要回答生命周期对应的钩子函数!

m0_71003185的博客 572

java 字符串

由于每次对String实例进行修改将创建一个新的String实例,因此如果连续多次对String实例进行修改将连续创建多个新的String实例,不必要的开销较大。另外,如果要忽略大小写排序,可以使用String类的toLowerCase()或toUpperCase()方法将字符串转换为全小写或全大写,再按照上面的方法排序。如果您需要对字符串中单词按字典序排序,可以使用Arrays类的sort方法和String类的split方法将字符串分割为单词,再排序。对字母排序,可以使用Arrays类的sort方法。

weixin_40540942的博客 552

HJ20 密码验证合格程序

华为机试题:HJ20 密码验证合格程序。

weixin_42307601的博客 789

软件设计-接口设计、代码优化

软件设计-接口设计、代码优化 前言 随着产品业务的发展,产品和用户量不断提升,由于之前每个产品对应一套接口,使得接口数目迅速膨胀,维护的成本也日渐变高。好的接口设计,不管从代码复用还是代码健壮性来看都尤为必要,从复杂的产品中抽象出一套公用接口也变得势在必行。 设计之初 首先,研究了大话设计模式这本书,统缆设计模式之后,从产品设计角度去分析,采用简单工厂尤为简便,但是具体的实现细节会被类case w...

java界的小学生 3622

深入解读Java复用技术的代码优化扩展要点

例如,一些基础工具类如java.lang.Math被声明为final,其提供的数学运算方法都是final,保证了运算逻辑的确定性和可靠性。通过方法抽取、合理使用final关键字等优化手段,以及基于接口、抽象类和设计模式的扩展方式,开发者能够编写出更健壮、灵活且易于维护的代码,充分发挥Java复用技术的优势,满足不断变化的业务需求。当需要新增一种图形(如三角形)时,只需创建一个新的类继承Shape类并实现draw方法,无需修改原有的Shape类和其他图形类,符合开闭原则,实现了代码的扩展

jarfg35的博客 549

代码优化原则

在进行代码优化时,需要遵循正确性、可读性、可维护性、性能、可扩展性、安全性和可移植性等原则,以确保优化后的代码既高效又易于维护。代码的可移植性是指代码能够在不同的平台和环境下运行的程度。在进行代码优化时,需要遵循可移植性原则,以确保优化后的代码能够在不同的平台和环境下运行。代码的可维护性是指代码易于修改和扩展的程度。优化后的代码应该保持良好的可维护性,以便于后续的功能扩展和错误修复。优化后的代码应该保持良好的可扩展性,以便于后续的功能扩展。优化后的代码应该保持良好的可读性,以便于后续的维护和扩展

m0_54829066的博客 1318

阿里一面:你做过哪些代码优化?来一个人人可以用的极品案例

这里尼恩给大家展示一个简单、又可以称之为极品、又是人人用得着的案例:后端接口返回结果的二次封装优化。此案例,既能展示大家对代码优雅的追求,也能展示大家对spring框架的雄厚内功,如果面试的时候如数家珍,能让面试官爱到 “刮目相看”。

架构师尼恩 4142

java代码优化的方法和准则_Java代码优化六大原则

单一职责代码优化第一步,单一职责原则 (Single Responsibility Principle)。对于一个Java类,应该仅有一个引起它变化的原因,也就是说,一个类中,应该是一组相关性很高的函数、数据的封装。但是这个原则的界限划分的并不是那么清晰,很大程度上要依赖于开发者的个人经验来定。对于单一职责界限的划分最大的问题就是类的职责是什么,如何划分类的职责。单一职责原则在我们实际工作中随处...

weixin_32801929的博客 661

代码优化视角看Java复用与组合应用

然后,通过组合这些工具类的实例,以及课程类和用户类,构建出课程管理服务类。课程管理服务类可以灵活地调用工具类的方法,以及课程类和用户类的相关功能,实现课程内容展示和学习进度跟踪的功能。例如,在一个企业级应用中,可能会复用多个通用的工具类,然后通过组合这些工具类的实例,构建出业务逻辑更复杂的服务类。在Java中,通过在一个类中包含其他类的实例,实现对象之间的组合。假设日志记录格式需要修改,在复用的情况下,只需修改日志工具类中的代码,而无需在每个使用日志记录的模块中逐一修改,大大提升了维护效率。

2501_91661377的博客 1638

java进阶2:类的关系、代码优化—城堡游戏、抽象与接口

子类型多态函数调用的绑定和覆盖overrideObject类增加新的子类。

m0_74824954的博客 906

java代码优化实例介绍

  Java 代码优化过程的实例介绍 来源:IBM developerworks   简介: 通过笔者经历的一个项目实例,本文介绍了 Java 代码优化的过程,总结了优化 Java 程序的一些最佳实践,分析了进行优化的方法,并解释了性能提升的原因。从多个角度分析导致性能低的原因,并逐个进行优化,最终使得程序的性能得到极大提升,代码的可读性、可扩展性更强。   衡量程序的标准   ...

备忘录之胡言乱语 373

牛客网力扣算法编程之六 | 字符串- 密码验证合格程序-Java代码实现

【算法编程】-密码验证合格程序 一. 描述 密码要求: 1.长度超过8位 2.包括大小写字母.数字.其它符号,以上四种至少三种 3.不能长度大于2的不含公共元素子串重复 (注:其他符号不含空格或换行) 数据范围:输入的字符串长度满足 本题有多组输入 输入描述: 一组或多组字符串。每组占一行 输出描述: 如果符合要求输出:OK,否则输出NG 示例1 输入: 021Abc9000 021Abc9Abc1 021ABC9000 021$bc9000输出: OK NG NG OK 二. 解题思路...

weixin_42886699的博客 1011

python的split()方法妙用

例如ACM模式下一道密码合格验证的算法题: 题目: 密码要求: 1.长度超过8位 2.包括大小写字母.数字.其它符号,以上四种至少三种 3.不能长度大于2包含公共元素子串重复 (注:其他符号不含空格或换行) 数据范围:输入的字符串长度满足 1 \le n \le 100 \1≤n≤100 输入描述: 一组字符串。 输出描述: 如果符合要求输出:OK,否则输出NG 示例: 输入 021Abc9000 021Abc9Abc1 021ABC9000 021$bc9000 输出 OK NG NG OK 代

qq_24889005的博客 842

HJ20 密码验证合格程序--Javascript V8

华为机试--Javascript V8

u014773932的博客 451

笔试题(九):密码合格性验证及字符串字符统计

字符串密码合格性验证

Trisyp的博客 509

HJ20 密码验证合格程序(不能长度大于2包含公共元素子串重复

3.不能长度大于2包含公共元素子串重复(注其他符号不含空格或换行)2.包括大小写字母.数字.其它符号,以上四种至少三种。数据范围输入的字符串长度满足1≤n≤100。如果符合要求输出OK,否则输出NG。.........

sunny_xiaot的博客 1187

不能长度超过2重复字符串

//不能长度超过2 的字符串重复字串 private static boolean dulpString(String s) { for (int i = 0; i < s.length()-2; i++) { //集合比较 String str=s.substring(i,i+3); ...

专注Java(全栈)应用开发,求知若渴,虚心若愚,talk is cheap, show me the code. 1139
上一篇: redis源码--SDS结构解析
下一篇: go-mod v2及以上版本的思考
黑夜与黎明
博客等级 码龄12年 2粉丝 · 22原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值