呢图网品牌网络seo方案外包

pingmian/2025/10/15 15:00:34/文章来源:
呢图网,品牌网络seo方案外包,自己制作广告图片软件,合肥做网站首选 晨飞网络怎样编写测试类测试分支很难为干净的代码找到一个好的定义#xff0c;因为我们每个人都有自己的单词clean的定义。 但是#xff0c;有一个似乎是通用的定义#xff1a; 简洁的代码易于阅读。 这可能会让您感到有些惊讶#xff0c;但我认为该定义也适用于测试代码。 使测试… 怎样编写测试类测试分支 很难为干净的代码找到一个好的定义因为我们每个人都有自己的单词clean的定义。 但是有一个似乎是通用的定义 简洁的代码易于阅读。 这可能会让您感到有些惊讶但我认为该定义也适用于测试代码。 使测试尽可能具有可读性是我们的最大利益因为 如果我们的测试易于阅读那么很容易理解我们的代码是如何工作的。 如果我们的测试易于阅读那么如果测试失败不使用调试器很容易发现问题。 编写干净的测试并不难但是需要大量的实践这就是为什么如此多的开发人员为此苦苦挣扎的原因。 我也为此感到挣扎这就是为什么我决定与您分享我的发现的原因。 这是我教程的第四部分描述了我们如何编写干净的测试。 这次我们将学习为什么不使用new关键字在测试方法中创建对象。 我们还将学习如何用工厂方法和测试数据构建器替换new关键字。 新不是新黑 在本教程中我们一直在重构单元测试以确保当使用唯一的电子邮件地址和社交登录提供者创建新用户帐户时 RepositoryUserService类的registerNewUserAccountRegistrationForm userAccountData方法能够按预期工作。 RegistrationForm类是一个数据传输对象DTO 我们的单元测试使用setter方法设置其属性值。 我们的单元测试的源代码如下所示相关代码突出显示 import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import org.springframework.security.crypto.password.PasswordEncoder;import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.mockito.Matchers.isA; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when;RunWith(MockitoJUnitRunner.class) public class RepositoryUserServiceTest {private static final String REGISTRATION_EMAIL_ADDRESS john.smithgmail.com;private static final String REGISTRATION_FIRST_NAME John;private static final String REGISTRATION_LAST_NAME Smith;private static final Role ROLE_REGISTERED_USER Role.ROLE_USER;private static final SocialMediaService SOCIAL_SIGN_IN_PROVIDER SocialMediaService.TWITTER;private RepositoryUserService registrationService;Mockprivate PasswordEncoder passwordEncoder;Mockprivate UserRepository repository;Beforepublic void setUp() {registrationService new RepositoryUserService(passwordEncoder, repository);}Testpublic void registerNewUserAccount_SocialSignInAndUniqueEmail_ShouldCreateNewUserAccountAndSetSignInProvider() throws DuplicateEmailException {RegistrationForm registration new RegistrationForm();registration.setEmail(REGISTRATION_EMAIL_ADDRESS);registration.setFirstName(REGISTRATION_FIRST_NAME);registration.setLastName(REGISTRATION_LAST_NAME);registration.setSignInProvider(SOCIAL_SIGN_IN_PROVIDER);when(repository.findByEmail(REGISTRATION_EMAIL_ADDRESS)).thenReturn(null);when(repository.save(isA(User.class))).thenAnswer(new AnswerUser() {Overridepublic User answer(InvocationOnMock invocation) throws Throwable {Object[] arguments invocation.getArguments();return (User) arguments[0];}});User createdUserAccount registrationService.registerNewUserAccount(registration);assertEquals(REGISTRATION_EMAIL_ADDRESS, createdUserAccount.getEmail());assertEquals(REGISTRATION_FIRST_NAME, createdUserAccount.getFirstName());assertEquals(REGISTRATION_LAST_NAME, createdUserAccount.getLastName());assertEquals(SOCIAL_SIGN_IN_PROVIDER, createdUserAccount.getSignInProvider());assertEquals(ROLE_REGISTERED_USER, createdUserAccount.getRole());assertNull(createdUserAccount.getPassword());verify(repository, times(1)).findByEmail(REGISTRATION_EMAIL_ADDRESS);verify(repository, times(1)).save(createdUserAccount);verifyNoMoreInteractions(repository);verifyZeroInteractions(passwordEncoder);} } 那么有什么问题呢 我们的单元测试中突出显示的部分很短而且相对容易阅读。 我认为此代码的最大问题是它是以数据为中心的。 它创建了一个新的RegistrationForm对象并设置了创建对象的属性值但没有描述这些属性值的含义。 如果我们使用new关键字在测试方法中创建新对象则由于以下原因我们的测试将变得难以阅读 读者必须知道所创建对象的不同状态。 例如如果我们考虑示例读者必须知道如果我们创建一个新的RegistrationForm对象并设置email firstName lastName和signInProvider属性的属性值则意味着该对象是一个注册即通过使用社交登录提供商进行。 如果创建的对象具有许多属性则创建该对象的代码会乱码我们测试的源代码。 我们应该记住即使我们在测试中需要这些对象我们也应该专注于描述被测试方法/功能的行为。 尽管不能完全消除这些缺点是不现实的但我们应尽最大努力将其影响降到最低并使我们的测试尽可能易于阅读。 让我们找出如何使用工厂方法来做到这一点。 使用工厂方法 当我们使用工厂方法创建新对象时我们应该以这种方式命名工厂方法及其方法参数以使我们的代码更易于读写。 让我们看一下两种不同的工厂方法看看它们对我们的单元测试的可读性有什么样的影响。 这些工厂方法通常添加到对象母类中因为它们通常对多个测试类有用。 但是由于我想保持简单因此将它们直接添加到测试类中。 第一个工厂方法的名称是newRegistrationViaSocialSignIn 并且没有方法参数。 在将此工厂方法添加到测试类之后单元测试的源如下所示相关部分已突出显示 import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import org.springframework.security.crypto.password.PasswordEncoder;import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.mockito.Matchers.isA; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when;RunWith(MockitoJUnitRunner.class) public class RepositoryUserServiceTest {private static final String REGISTRATION_EMAIL_ADDRESS john.smithgmail.com;private static final String REGISTRATION_FIRST_NAME John;private static final String REGISTRATION_LAST_NAME Smith;private static final Role ROLE_REGISTERED_USER Role.ROLE_USER;private static final SocialMediaService SOCIAL_SIGN_IN_PROVIDER SocialMediaService.TWITTER;private RepositoryUserService registrationService;Mockprivate PasswordEncoder passwordEncoder;Mockprivate UserRepository repository;Beforepublic void setUp() {registrationService new RepositoryUserService(passwordEncoder, repository);}Testpublic void registerNewUserAccount_SocialSignInAndUniqueEmail_ShouldCreateNewUserAccountAndSetSignInProvider() throws DuplicateEmailException {RegistrationForm registration newRegistrationViaSocialSignIn();when(repository.findByEmail(REGISTRATION_EMAIL_ADDRESS)).thenReturn(null);when(repository.save(isA(User.class))).thenAnswer(new AnswerUser() {Overridepublic User answer(InvocationOnMock invocation) throws Throwable {Object[] arguments invocation.getArguments();return (User) arguments[0];}});User createdUserAccount registrationService.registerNewUserAccount(registration);assertEquals(REGISTRATION_EMAIL_ADDRESS, createdUserAccount.getEmail());assertEquals(REGISTRATION_FIRST_NAME, createdUserAccount.getFirstName());assertEquals(REGISTRATION_LAST_NAME, createdUserAccount.getLastName());assertEquals(SOCIAL_SIGN_IN_PROVIDER, createdUserAccount.getSignInProvider());assertEquals(ROLE_REGISTERED_USER, createdUserAccount.getRole());assertNull(createdUserAccount.getPassword());verify(repository, times(1)).findByEmail(REGISTRATION_EMAIL_ADDRESS);verify(repository, times(1)).save(createdUserAccount);verifyNoMoreInteractions(repository);verifyZeroInteractions(passwordEncoder);}private RegistrationForm newRegistrationViaSocialSignIn() {RegistrationForm registration new RegistrationForm();registration.setEmail(REGISTRATION_EMAIL_ADDRESS);registration.setFirstName(REGISTRATION_FIRST_NAME);registration.setLastName(REGISTRATION_LAST_NAME);registration.setSignInProvider(SOCIAL_SIGN_IN_PROVIDER);return registration;} } 第一种工厂方法具有以下后果 我们测试方法的一部分它创建了新的RegistrationForm对象比以前干净得多并且工厂方法的名称描述了所创建的RegistrationForm对象的状态。 我们的模拟对象的配置更难以阅读因为email属性的值在我们的工厂方法中被“隐藏”了。 由于创建的RegistrationForm对象的属性值被“隐藏”在我们的工厂方法中因此我们的断言更难以阅读。 如果使用对象母模式 则问题将更大因为我们必须将相关的常量移至对象母类。 我认为可以说尽管第一种工厂方法有其好处但它也有严重的缺点。 让我们看看第二种工厂方法是否可以消除这些缺点。 第二个工厂方法的名称为newRegistrationViaSocialSignIn 并且它将电子邮件地址名字姓氏和提供程序中的社交符号作为方法参数。 在将此工厂方法添加到测试类之后单元测试的源如下所示相关部分已突出显示 import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import org.springframework.security.crypto.password.PasswordEncoder;import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.mockito.Matchers.isA; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when;RunWith(MockitoJUnitRunner.class) public class RepositoryUserServiceTest {private static final String REGISTRATION_EMAIL_ADDRESS john.smithgmail.com;private static final String REGISTRATION_FIRST_NAME John;private static final String REGISTRATION_LAST_NAME Smith;private static final Role ROLE_REGISTERED_USER Role.ROLE_USER;private static final SocialMediaService SOCIAL_SIGN_IN_PROVIDER SocialMediaService.TWITTER;private RepositoryUserService registrationService;Mockprivate PasswordEncoder passwordEncoder;Mockprivate UserRepository repository;Beforepublic void setUp() {registrationService new RepositoryUserService(passwordEncoder, repository);}Testpublic void registerNewUserAccount_SocialSignInAndUniqueEmail_ShouldCreateNewUserAccountAndSetSignInProvider() throws DuplicateEmailException {RegistrationForm registration newRegistrationViaSocialSignIn(REGISTRATION_EMAIL_ADDRESS,REGISTRATION_FIRST_NAME,REGISTRATION_LAST_NAME,SOCIAL_MEDIA_SERVICE);when(repository.findByEmail(REGISTRATION_EMAIL_ADDRESS)).thenReturn(null);when(repository.save(isA(User.class))).thenAnswer(new AnswerUser() {Overridepublic User answer(InvocationOnMock invocation) throws Throwable {Object[] arguments invocation.getArguments();return (User) arguments[0];}});User createdUserAccount registrationService.registerNewUserAccount(registration);assertEquals(REGISTRATION_EMAIL_ADDRESS, createdUserAccount.getEmail());assertEquals(REGISTRATION_FIRST_NAME, createdUserAccount.getFirstName());assertEquals(REGISTRATION_LAST_NAME, createdUserAccount.getLastName());assertEquals(SOCIAL_SIGN_IN_PROVIDER, createdUserAccount.getSignInProvider());assertEquals(ROLE_REGISTERED_USER, createdUserAccount.getRole());assertNull(createdUserAccount.getPassword());verify(repository, times(1)).findByEmail(REGISTRATION_EMAIL_ADDRESS);verify(repository, times(1)).save(createdUserAccount);verifyNoMoreInteractions(repository);verifyZeroInteractions(passwordEncoder);}private RegistrationForm newRegistrationViaSocialSignIn(String emailAddress, String firstName, String lastName, SocialMediaService signInProvider) {RegistrationForm registration new RegistrationForm();registration.setEmail(emailAddress);registration.setFirstName(firstName);registration.setLastName(lastName);registration.setSignInProvider(signInProvider);return registration;} } 第二种工厂方法具有以下后果 我们的测试方法的一部分创建新的RegistrationForm对象比使用第一个工厂方法的相同代码稍微有些混乱。 但是它仍然比原始代码干净因为factory方法的名称描述了创建对象的状态。 似乎消除了第一个工厂方法的弊端因为创建的对象的属性值未“隐藏”在工厂方法内部。 看起来很酷对吧 真的很容易想到天堂里一切都很好但是事实并非如此。 尽管我们已经看到工厂方法可以使我们的测试更具可读性但事实是只有在满足以下条件时它们才是一个不错的选择 工厂方法没有太多的方法参数。 当方法参数的数量增加时我们的测试将变得更加难以读写。 显而易见的问题是工厂方法可以有多少个方法参数 不幸的是很难给出确切的答案但是我认为如果工厂方法只有少数方法参数那么使用工厂方法是一个不错的选择。 测试数据没有太大的差异。 使用工厂方法的问题是单个工厂方法通常适用于一个用例。 如果我们需要支持N个用例则需要N种工厂方法。 这是一个问题因为随着时间的流逝我们的工厂方法变得ated肿混乱并且难以维护尤其是如果使用对象母模式。 让我们找出测试数据生成器是否可以解决其中一些问题。 使用测试数据构建器 测试数据构建器是使用构建器模式创建新对象的类。 Effective Java中描述的构建器模式有很多好处 但是我们的主要动机是提供一种流畅的API以创建测试中使用的对象。 我们可以按照以下步骤创建一个测试数据构建器类该类创建新的RegistrationForm对象 创建一个RegistrationFormBuilder类。 将RegistrationForm字段添加到创建的类。 该字段包含对创建对象的引用。 将默认构造函数添加到创建的类中并通过创建新的RegistrationForm对象来实现它。 添加用于设置创建的RegistrationForm对象的属性值的方法。 每个方法都通过调用正确的setter方法来设置属性值并返回对RegistrationFormBuilder对象的引用。 请记住这些方法的方法名称可以建立或破坏我们的DSL 。 向所创建的类中添加一个build方法并通过返回所创建的RegistrationForm对象来实现它。 我们的测试数据构建器类的源代码如下所示 public class RegistrationFormBuilder {private RegistrationForm registration;public RegistrationFormBuilder() {registration new RegistrationForm();}public RegistrationFormBuilder email(String email) {registration.setEmail(email);return this;}public RegistrationFormBuilder firstName(String firstName) {registration.setFirstName(firstName);return this;}public RegistrationFormBuilder lastName(String lastName) {registration.setLastName(lastName);return this;}public RegistrationFormBuilder isSocialSignInViaSignInProvider(SocialMediaService signInProvider) {registration.setSignInProvider(signInProvider);return this;}public RegistrationForm build() {return registration;} } 在修改了单元测试以使用新的测试数据构建器类之后其源代码如下所示相关部分已突出显示 import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import org.springframework.security.crypto.password.PasswordEncoder;import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.mockito.Matchers.isA; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when;RunWith(MockitoJUnitRunner.class) public class RepositoryUserServiceTest {private static final String REGISTRATION_EMAIL_ADDRESS john.smithgmail.com;private static final String REGISTRATION_FIRST_NAME John;private static final String REGISTRATION_LAST_NAME Smith;private static final Role ROLE_REGISTERED_USER Role.ROLE_USER;private static final SocialMediaService SOCIAL_SIGN_IN_PROVIDER SocialMediaService.TWITTER;private RepositoryUserService registrationService;Mockprivate PasswordEncoder passwordEncoder;Mockprivate UserRepository repository;Beforepublic void setUp() {registrationService new RepositoryUserService(passwordEncoder, repository);}Testpublic void registerNewUserAccount_SocialSignInAndUniqueEmail_ShouldCreateNewUserAccountAndSetSignInProvider() throws DuplicateEmailException {RegistrationForm registration new RegistrationFormBuilder().email(REGISTRATION_EMAIL_ADDRESS).firstName(REGISTRATION_FIRST_NAME).lastName(REGISTRATION_LAST_NAME).isSocialSignInViaSignInProvider(SOCIAL_SIGN_IN_PROVIDER).build();when(repository.findByEmail(REGISTRATION_EMAIL_ADDRESS)).thenReturn(null);when(repository.save(isA(User.class))).thenAnswer(new AnswerUser() {Overridepublic User answer(InvocationOnMock invocation) throws Throwable {Object[] arguments invocation.getArguments();return (User) arguments[0];}});User createdUserAccount registrationService.registerNewUserAccount(registration);assertEquals(REGISTRATION_EMAIL_ADDRESS, createdUserAccount.getEmail());assertEquals(REGISTRATION_FIRST_NAME, createdUserAccount.getFirstName());assertEquals(REGISTRATION_LAST_NAME, createdUserAccount.getLastName());assertEquals(SOCIAL_SIGN_IN_PROVIDER, createdUserAccount.getSignInProvider());assertEquals(ROLE_REGISTERED_USER, createdUserAccount.getRole());assertNull(createdUserAccount.getPassword());verify(repository, times(1)).findByEmail(REGISTRATION_EMAIL_ADDRESS);verify(repository, times(1)).save(createdUserAccount);verifyNoMoreInteractions(repository);verifyZeroInteractions(passwordEncoder);} } 如我们所见测试数据构建器具有以下优点 创建新的RegistrationForm对象的代码易于阅读和编写。 我非常喜欢流畅的API并且我认为这段代码既优美又优雅。 构建器模式可确保从我们的测试数据中发现的变化不再是问题因为我们可以简单地将新方法添加到测试数据构建器类中。 模拟对象和断言的配置易于阅读因为常量在我们的测试方法中可见并且DSL强调每个属性值的含义。 那么我们应该对所有内容使用构建器模式吗 没有 仅在有意义时才应使用测试数据构建器。 换句话说我们应该在以下情况下使用它们 我们设置了许多属性值。 我们的测试数据有很大的差异。 如果满足以下条件之一则构建器模式是一个完美的选择。 原因是我们可以通过命名builder类的setter-like方法来创建特定于域的语言 。 即使我们将创建许多不同的对象并设置许多属性值这也使我们的测试易于读写。 那是建造者木匠的力量。 如果您想了解有关流利API的更多信息则应阅读以下文章 流利的界面 Java Fluent API设计器速成课程 用Java构建流畅的API内部DSL 今天就这些。 让我们继续并总结从这篇博客文章中学到的知识。 摘要 我们了解了为什么使用new关键字在测试方法中创建对象不是一个好主意并且我们学习了两种不同的方法来创建在测试中使用的对象。 更具体地说这篇博客文章教会了我们三件事 通过使用new关键字在测试方法中创建所需的对象是一个坏主意因为它会使我们的测试混乱且难以阅读。 如果我们只需要设置少数几个属性值而我们的测试数据没有太多变化则应该使用工厂方法来创建所需的对象。 如果必须设置很多属性值和/或我们的测试数据有很多差异则应该使用测试数据生成器来创建所需的对象。 翻译自: https://www.javacodegeeks.com/2014/05/writing-clean-tests-new-considered-harmful.html怎样编写测试类测试分支

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/87835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安新seo优化排名网站h5制作官网

目录 一.设计一个类,不能被拷贝 二.设计一个类只能在堆上创建对象 三.设计一个类只能在栈上创建对象 四. 请设计一个类,不能被继承 五.请设计一个类,只能创建一个对象(单例模式) 1.单例模式: 2. 饿汉模式 一.设计一个类&#x…

外贸视频网站wordpress模版哪个好

sysbench 是一个非常经典的综合性能测试工具,通常都用它来做数据库的性能压测,但也可以用来做CPU,IO的性能测试。而对于IO测试,不是很推荐sysbench,倒不是说它有错误,工具本身没有任何问题,它的…

什么软件做网站最好怎么让自己的网站通过域名访问不了

nohup 是一个 POSIX 命令,它的名称来源于“no hang up”的缩写。这个命令的基本用途是运行一个命令,使得该命令在用户登出或者终端关闭后继续运行。nohup 命令通常与后台运行的命令(使用 & 符号)结合使用,以便在终…

中国建设教育网官方网站企业信息化建设如何帮助客户理解网站流量

卓里奇书好的一点就是,不是直接引出公式,而是告诉你理由。先引出正交的概念,然后在函数空间中,也有正交,只不过是无限维的空间。 这里要注意,明确说明了是有限个。 在函数空间里面,内积是指进行…

商务网站建设工程师如何帮人做网站赚钱吗

目录 引出nacos服务器和命名空间Nacos服务器命名空间 springBoot整合nacosspringcloud Alibaba 版本与springcloud对应关系引包配置maincontroller 报错以及解决【报错】错误:缺少服务名称报错:9848端口未开放 启动测试引入多个nacos配置多个配置的情况没…

襄阳专业做网站想学网站开发

一、数学运算类 abs(x) 求绝对值 1 、参数可以是整型,也可以是复数 2 、若参数是复数,则返回复数的模 complex([real[, imag]]) 创建一个复数 divmod(a, b) 分别取商和余数 注意:整型、浮点型都可以 float([x]) 将一个字符串或数转换为浮点数…

做一个企业网站设计长春网站建设那家好

C入门 文章目录 C入门框架命名空间 namespace &#xff08;不常用&#xff09;命名空间的使用方式&#xff08;三种&#xff09;using namespace std;\<iostream>coutendlcincout的使用命名冲突缺省参数&#xff08;省钱的省&#xff09;缺省参数分类全缺省参数半缺省参数…

小程序电商平台排名嘉兴做网站优化价格

TCL&#xff1a;花开刹那还是浴火重生 [url]http://www.sina.com.cn[/url] 2008年04月07日 15:24 民营经济报本报记者 叶键 TCL3月份公布了2007年财报&#xff0c;公司净利润达3.9亿元&#xff0c;并于3月27日“摘星脱帽”&#xff0c;恢复为“TCL集团”的自由身&#xff0c;…

网站建设总结ppt深圳做网站的公司的区域

1、效果 如下图所示&#xff0c;我们在输入大学时&#xff0c;程序会到后端查询名字中包含大学的数据&#xff0c;并展示到前端页面。 用户选择一个大学&#xff0c;该大学值会被赋值到input表单&#xff0c;同时关闭下拉表单&#xff1b; 当页面展示的数据都不符合条件时&…

安徽城乡住房建设厅网站网站建设預算

这里写目录标题 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真4. 实物烧录和现象5. 程序代码6. 设计资料内容清单&&下载链接资料下载链接&#xff1a; 【普中开发板】基于51单片机温度报警器设计( proteus仿真程序实物演示讲解视频&#xff09; Proteus 仿真…

个人网站可以收费吗网站建设源代码版权问题

大家好&#xff0c;我是若川。持续组织了近一年的源码共读活动&#xff0c;感兴趣的可以 加我微信lxchuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外&…

政务建设网站得必要性网站开发在线学习

通信框架功能设计 功能描述 通信框架承载了业务内部各模块之间的消息交互和服务调用&#xff0c;它的主要功能如下&#xff1a; 基于 Netty 的 NIO 通信框架&#xff0c;提供高性能的异步通信能力&#xff1b; 提供消息的编解码框架&#xff0c;可以实现 POJO 的序列化和反序…

泰和网站制作厦门网页建站申请费用

emlog默许不能生成静态文件&#xff0c;不过彷佛有生成静态页面的相干插件&#xff0c;该插件博客吧先不研讨&#xff0c;本日博客簿要引见的是emlog 4.0版本在IIS6环境下的伪静态划定规矩&#xff0c;人人都晓得&#xff0c;经由过程伪静态能够让博客文章网址变得对搜索引擎越…

ui设计的细分研究方向包含哪几项福州搜索优化网站

线程同步机制为线程协同工作而设计&#xff0c;windows系统中有多种机制可以用于线程同步&#xff0c;最常用的有下面几种&#xff1a; 互斥对象(Mutex)时间对象(Event)信号量(Semaphore)临界区(critical section)可等待计时器(waitable Timer)同步过程中两个重要的概念是同步对…

石家庄建设企业网站建设我们的网站

GPS北斗卫星同步时钟系统(北斗授时设备)在通信系统中应用 GPS北斗卫星同步时钟系统(北斗授时设备)在通信系统中应用 卫星时间同步系统是根据《华东电网统一时钟系统技术规范》、《上海电网GPS时间同步系统技术原则和运行管理规定》和《电力系统时间同步技术规范》设计的时间同步…

做平台的网站有哪些功能张店学校网站建设定制

最近在使用这几个在做项目&#xff0c;因为第一次用这个&#xff0c;所以不免有些问题。总结下踩的坑 1.测试类位置 首先测试类约定会放在tests里面&#xff0c;不然有可能发生引入包的问题&#xff0c;会报错某些包找不到。 2. 测试类依赖注入 这里我就用的真实的数据库操作…

学校网站群建设做采购 通常在什么网站看

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

哪个网站专门做商铺啊德州市住房和城乡建设部网站

贪心算法-活动安排-最详细注释解析 题目&#xff1a; 学校在最近几天有n个活动&#xff0c;这些活动都需要使用学校的大礼堂&#xff0c;在同一时间&#xff0c;礼堂只能被一个活动使用。由于有些活动时间上有冲突&#xff0c;学校办公室人员只好让一些活动放弃使用礼堂而使用…

单页营销式网站模板app开发公司有哪些部门

1.MySQL为什么要用数字做自增主键&#xff1f; 首先为什么我们使用的是int类型&#xff0c;而不是varchar类型 int永远是固定的4个字节&#xff0c;而char类型是1~255字节之间 优点 占用空间小&#xff0c;节省CPU开销在使用中&#xff0c;通常会在主键上建立索引&#xff…

爱网站大全广州seo网络优化公司

问题描述&#xff1a; 一打开office就显示正在更新&#xff0c;请稍后&#xff0c;过一会就弹窗报错。 解决方案&#xff1a; 1.winR输入services.msc 2.将Microsoft Office即点即用服务设为自动 如果第二步中已经是自动状态&#xff0c;先禁用一下&#xff0c;再重新设置为…