代码规范的重要性及其在编程中的应用
文章目录

1. 代码规范的重要性 1.1 什么是规范?
在讲代码标准之前,我们先来说说什么是路,鲁迅《故乡》原文的结尾提到:“其实地上本没有路,走的人多了就成了路”。代码规范就像世界上的道路。代码本来只是为了实现某些功能。你可以随心所欲地写,但是大家慢慢习惯了,在程序中用同一种表示方法来实现某种功能,于是就有了代码规范,然后所有程序员都按照这个规范来写。它就像世界上的一条路。到一个地方不走好路,就得选沟渠。你在哪,这不是给自己找麻烦吗?又比如,国家原本没有交通规则,但为了保证交通的畅通和人们出行的便利,国家制定了一系列规则。因此,代码必须标准化。 ## 标题
1.2 标题编码标准的原因
1.1.代码规范可以保证代码风格的一致性:
因为在软件的整个生命周期中,软件的作者往往不是同一个人。如果每个人都遵循这个规范,那么每个人的编码风格就会一致。
2.代码规范可以提高代码的可读性:
如果编码风格一致,那么别人写的代码和自己写的代码就不会有什么区别。这将使程序员能够快速上手并很好地理解软件。
当你看到这样的一段代码时,你一定会有妈妈的感觉。 。 。突然我感觉很糟糕。 。 。
这段代码比较简单,代码量也比较少,所以看起来并没有太难理解。但是,当代码量达到几千甚至几万行的时候,如果代码还是这样的话,肯定会相当混乱。你可能需要花几个小时才能理解一个小功能,也可能需要你一天的时间来调整一个小bug。 。 。
3、代码规范可以降低软件维护成本:
大家都知道,在软件的整个生命周期中,大约80%的时间都花在了软件的维护上。如果遵循这个代码约定,代码风格就会保持一致,代码的可读性就会提高,维护时间自然就会缩短。
1.3 需要注意的细节
1.当需要Map的主键和值时,应该迭代entrySet
当循环中只需要 Map 的主键时,迭代 keySet 是正确的。然而,当需要主键和值时,迭代entrySet会更高效。它比先迭代 keySet 然后获取值具有更好的性能。
反例:
Map <String ,String >map =...;
for(String key :map .keySet){
String value =map .get(key );
...
}
正面例子:
Map <String ,String >map =...;
for(Map .Entry <String ,String >entry :map .entrySet){
String key =entry .getKey;
String value =entry .getValue;
...
}
2.Collection.isEmpty应该用来检测空
使用 Collection.size 来检测空性在逻辑上没有任何问题,但使用 Collection.isEmpty 可以使代码更具可读性并获得更好的性能。任何 Collection.isEmpty 实现的时间复杂度都是 O(1),但某些 Collection.size 实现的时间复杂度可能是 O(n)。
反例:
if(collection .size==0){
...
}
正面例子:
if(collection .isEmpty){
...
}
3. 不要将集合对象传递给自己
此外,由于某些方法需要参数在执行期间保留,因此将集合传递给自身可能会导致意外行为。
反例:
List <String >list =newArrayList<>;
list .add("Hello");
list .add("World");
if(list .containsAll(list )){// 无意义,总是返回true
...
}
list.removeAll(list);// 性能差, 直接使用clear
4.尝试指定集合初始化的大小
Java的集合类使用起来非常方便,但是查看源码我们可以看到集合也是有大小限制的。每次扩展的时间复杂度很可能是 O(n),因此尝试指定一个可预测的集合大小以减少集合扩展的次数。
反例:
int[]arr =newint[]{1,2,3};
List <Integer >list =newArrayList<>;
for(inti :arr ){
list .add(i );
}
正面例子:
int[]arr =newint[]{1,2,3};
List <Integer >list =newArrayList<>(arr .length );
for(inti :arr ){
list.add(i);
}
5.使用StringBuilder进行字符串连接
一般的字符串拼接都会被Java在编译时进行优化,但是循环中的字符串拼接在Java编译时是无法优化的,所以需要使用StringBuilder来进行替换。
反例:
String s ="";
for(inti =0;i <10;i ++){
s +=i ;
}
正面例子:
String a ="a";
String b ="b";
String c ="c";
String s =a +b +c ;// 没问题,java编译器会进行优化
StringBuilder sb =newStringBuilder;
for(inti =0;i <10;i ++){
sb .append(i );// 循环中,java编译器无法进行优化,所以要手动使用StringBuilder
}
6.随机访问List
大家都知道数组和链表的区别:随机访问数组效率更高。调用方法获取List后,如果想随机访问里面的数据,并且不知道数组的内部实现是链表还是数组,怎么办?您可以判断它是否实现了 *RandomAccess* 接口。
正面例子:
// 调用别人的服务获取到list
List <Integer >list =otherService .getList;
if(list instanceofRandomAccess){
// 内部数组实现,可以随机访问
System .out .println(list .get(list .size-1));
}else{
// 内部可能是链表实现,随机访问效率低
}
7. 如果经常调用Collection.contains方法,请使用Set。
在Java集合类库中,List的contains方法一般时间复杂度为O(n)。如果代码中需要频繁调用 contains 方法查找数据,可以先将 list 转换为 HashSet 实现,以降低 O(n) 的时间复杂度。度数下降到 O(1)。
反例:
ArrayList <Integer >list =otherService .getList;
for(inti =0;i <=Integer .MAX_VALUE ;i ++){
// 时间复杂度O(n)
list .contains(i );
}
正面例子:
ArrayList <Integer >list =otherService .getList;
Set <Integer >set =newHashSet(list );
for(inti =0;i <=Integer .MAX_VALUE ;i ++){
// 时间复杂度O(1)
set .contains(i );
}
8、长整常数后面加一个大写的L
当使用长整数常量值时,需要在末尾添加L。必须是大写 L,不能是小写 l。小写的 l 很容易与数字 1 混淆并引起误解。
反例:
longvalue =1l ;
longmax =Math .max(1L ,5);
正面例子:
longvalue =1L ;
longmax =Math .max(1L ,5L );
9. 不要使用魔法点
当您编写一段代码时,使用魔法值可能看起来很明显,但在调试时它们似乎并不那么明显。这就是为什么魔术值需要定义为可读常量。但是,-1、0 和 1 不被视为魔法值。
反例:
for(inti =0;i <100;i ++){
...
}
if(a ==100){
...
}
正面例子:
privatestaticfinalintMAX_COUNT =100;
for(inti =0;i <MAX_COUNT ;i ++){
...
}
if(count ==MAX_COUNT ){
...
}
10. 不要使用集合实现来分配静态成员变量
对于集合类型的静态成员变量,不要使用集合实现来赋值。相反,使用静态代码块来赋值。
反例:
privatestaticMap <String ,Integer >map =newHashMap<String ,Integer >{
{
put("a",1);
put("b",2);
}
};
privatestaticList <String >list =newArrayList<String >{
{
add("a");
add("b");
}
};
正面例子:
privatestaticMap <String ,Integer >map =newHashMap<>;
static{
map .put("a",1);
map .put("b",2);
};
privatestaticList <String >list =newArrayList<>;
static{
list .add("a");
list .add("b");
};
11.建议使用try-with-resources语句
Java 7中引入了try-with-resources语句,该语句可以保证相关资源被关闭,比原来的try-catch-finally语句更好,让程序代码更安全、简洁。
反例:
privatevoidhandle(String fileName ){
BufferedReader reader =null ;
try{
String line ;
reader =newBufferedReader(newFileReader(fileName ));
while((line =reader .readLine)!=null ){
...
}
}catch(Exceptione ){
...
}finally{
if(reader !=null ){
try{
reader .close;
}catch(IOExceptione ){
...
}
}
}
}
正面例子:
privatevoidhandle(String fileName ){
try(BufferedReader reader =newBufferedReader(newFileReader(fileName ))){
String line ;
while((line =reader .readLine)!=null ){
...
}
}catch(Exceptione ){
...
}
}
12.删除未使用的私有方法和字段
删除未使用的私有方法和字段,使代码更简单、更易于维护。如果需要再次使用,可以从历史提交中检索。
反例:
publicclassDoubleDemo1{
privateintunusedField =100;
privatevoidunusedMethod{
...
}
publicintsum(inta ,intb ){
returna +b ;
}
}
正面例子:
publicclassDoubleDemo1{
publicintsum(inta ,intb ){
returna +b ;
}
}
13.删除未使用的局部变量
删除未使用的局部变量,使代码更加简洁,更易于维护。
反例:
publicintsum(inta ,intb ){
intc =100;
returna +b ;
}
正面例子:
publicintsum(inta ,intb ){
returna +b ;
}
14.删除未使用的方法参数
未使用的方法参数会产生误导。删除未使用的方法参数,使代码更简单,更易于维护。但由于被重写的方法是基于父类或接口的方法定义,即使有未使用的方法参数,也无法删除。
反例:
publicintsum(inta ,intb ,intc ){
returna +b ;
}
正面例子:
publicintsum(inta ,intb ){
returna +b ;
}
15. 删除表达式中多余的括号
有些人认为对应表达式中多余的括号对代码阅读有帮助,而另一些人则认为完全没有必要。对于熟悉Java语法的人来说,表达式中多余的括号会让代码变得更加繁琐。
反例:
return(x );
return(x +2);
intx =(y *3)+1;
intm =(n *4+2);
正面例子:
returnx ;
returnx +2;
intx =y *3+1;
intm =n *4+2;
16.工具类应该屏蔽构造函数
实用程序类是不应实例化的静态字段和函数的集合。然而,Java 为每个没有显式定义构造函数的类添加了隐式公共构造函数。因此,为了避免Java“新手”错误地使用它,应该显式定义一个私有构造函数来屏蔽这个隐式的公共构造函数。
反例:
publicclassMathUtils{
publicstaticfinaldoublePI =3.1415926D;
publicstaticintsum(inta ,intb ){
returna +b ;
}
}
正面例子:
publicclassMathUtils{
publicstaticfinaldoublePI =3.1415926D;
privateMathUtils{}
publicstaticintsum(inta ,intb ){
returna +b ;
}
}
17. 删除多余的异常捕获和抛出
使用catch语句捕获异常后,不会进行任何处理,并重新抛出异常。这与不捕获异常具有相同的效果。您可以删除此代码或添加其他处理。
反例:
privatestaticString readFile(String fileName )throwsIOException {
try(BufferedReader reader =newBufferedReader(newFileReader(fileName ))){
String line ;
StringBuilder builder =newStringBuilder;
while((line =reader .readLine)!=null ){
builder .append(line );
}
returnbuilder .toString;
}catch(Exceptione ){
throwe ;
}
}
正面例子:
privatestaticString readFile(String fileName )throwsIOException {
try(BufferedReader reader =newBufferedReader(newFileReader(fileName ))){
String line ;
StringBuilder builder =newStringBuilder;
while((line =reader .readLine)!=null ){
builder .append(line );
}
returnbuilder .toString;
}
}
18. 公共静态常量应该通过类访问
虽然允许通过类的实例访问公共静态常量,但很容易错误地认为类的每个实例都有一个公共静态常量。因此,公共静态常量应该直接通过类访问。
反例:
publicclassUser{
publicstaticfinalString CONST_NAME ="name";
...
}
User user =newUser;
String nameKey =user .CONST_NAME ;
正面例子:
publicString getUserName(User user ){
if(Objects .isNull(user )){
returnnull ;
}
returnuser .getName;
}
20.使用String.valueOf(value)代替“”+value
当将其他对象或类型转换为字符串时,使用 String.valueOf(value) 比 ""+value 更高效。
反例:
inti =1;
String s =""+i ;
正面例子:
inti =1;
String s =String .valueOf(i );
21.为过时的代码添加@Deprecated注解
当一段代码已经过时,但由于兼容性原因无法直接删除,并且你不希望以后任何人再次使用它时,你可以添加@Deprecated注解来标记它。将 @deprecated 添加到文档注释中以解释并提供替代方案
正面例子:
/**
* 保存
*
* @deprecated 此方法效率较低,请使用{@link newSave}方法替换它
*/
@Deprecated
publicvoidsave{
// do something
}
22.禁止使用构造函数BigDecimal(double)
BigDecimal(double)存在精度丢失的风险,在精确计算或数值比较的场景下可能会导致业务逻辑异常。
反例:
BigDecimal value =newBigDecimal(0.1D);// 0.100000000000000005551115...
正面例子:
BigDecimal value =BigDecimal .valueOf(0.1D);;// 0.1
23.返回空数组和空集合而不是null
返回null需要调用者强制检测null,否则会抛出空指针异常。返回空数组或空集合可以有效防止调用者抛出空指针异常,因为未检测到 null。也可以删除调用者检测null的语句,让代码更加简洁。
反例:
publicstaticResult []getResults{
returnnull ;
}
publicstaticList <Result >getResultList{
returnnull ;
}
publicstaticMap <String ,Result >getResultMap{
returnnull ;
}
publicstaticvoidmain(String []args ){
Result []results =getResults;
if(results !=null ){
for(Result result :results ){
...
}
}
List <Result >resultList =getResultList;
if(resultList !=null ){
for(Result result :resultList ){
...
}
}
Map <String ,Result >resultMap =getResultMap;
if(resultMap !=null ){
for(Map .Entry <String ,Result >resultEntry :resultMap ){
...
}
}
}
正面例子:
publicstaticResult []getResults{
returnnewResult[0];
}
publicstaticList <Result >getResultList{
returnCollections .emptyList;
}
publicstaticMap <String ,Result >getResultMap{
returnCollections .emptyMap;
}
publicstaticvoidmain(String []args ){
Result []results =getResults;
for(Result result :results ){
...
}
List <Result >resultList =getResultList;
for(Result result :resultList ){
...
}
Map <String ,Result >resultMap =getResultMap;
for(Map .Entry <String ,Result >resultEntry :resultMap ){
...
}
}
24.优先使用常量或某些值来调用equals方法
对象的equals方法很容易抛出空指针异常。您应该使用常量或具有特定值的对象来调用 equals 方法。当然,使用 java.util.Objects.equals 方法是最佳实践。
反例:
publicvoidisFinished(OrderStatus status ){
returnstatus .equals(OrderStatus .FINISHED );// 可能抛空指针异常
}
正面例子:
publicvoidisFinished(OrderStatus status ){
returnOrderStatus .FINISHED .equals(status );
}
publicvoidisFinished(OrderStatus status ){
returnObjects .equals(status ,OrderStatus .FINISHED );
}
25.枚举的属性字段必须是私有且不可变的
枚举通常用作常量。如果枚举中存在公共属性字段或设置字段方法,则可以轻松修改这些枚举常量的属性。理想情况下,枚举中的属性字段是私有的并在私有构造函数中分配。没有对应的Setter方法。最好加上final修饰符。
反例:
publicenumUserStatus { DISABLED(0, "禁用"), ENABLED(1, "启用");
publicintvalue;privateString deion;
privateUserStatus(intvalue, String deion){this.value= value;this.deion = deion;}
publicString getDeion(){returndeion;}
publicvoidsetDeion(String deion){this.deion = deion;}}
正面例子:
publicenumUserStatus {
DISABLED(0,"禁用"),
ENABLED(1,"启用");
privatefinalintvalue ;
privatefinalString deion ;
privateUserStatus(intvalue ,String deion ){
this.value =value ;
this.deion =deion ;
}
publicintgetValue{
returnvalue ;
}
publicString getDeion{
returndeion ;
}
}
26.小心String.split(String regex)
String的split方法,传入的分隔字符串是正则表达式!部分关键字(如.[]|等)需要转义
反例:
"a.ab.abc".split(".");// 结果为[]
"a|ab|abc".split("|");// 结果为["a", "|", "a", "b", "|", "a", "b", "c"]
正面例子:
"a.ab.abc".split(".");// 结果为["a", "ab", "abc"]
"a|ab|abc".split("|");// 结果为["a", "ab", "abc"]
2. Spring boot后端编码注意事项(后端人员)
网上关于springboot的内容确实太多了,所以我就选一些跟大家分享一下。为了得到你们的支持,我现在将这封信转给我亲爱的朋友们。
2.1 Spring Boot核心功能
1)独立运行Spring项目
Spring Boot可以以jar包的形式独立运行。运行Spring Boot项目,只需要运行java –jar xx.jar即可。
2)嵌入Servlet容器
Spring Boot可以选择嵌入Tomcat、Jetty或Undertow,因此我们不需要以war包的形式部署项目。
3)提供starter,简化Maven配置
Spring提供了一系列starter pom来简化Maven的依赖加载。例如,当您使用spring-boot-starter-web时,会自动添加如图1所示的依赖包。
4)自动配置Spring
Spring Boot会根据jar包和类路径中的类自动为jar包中的类配置bean,这将大大减少我们需要使用的配置。当然,Spring Boot只考虑了大部分开发场景,而不是所有场景。如果我们在实际开发中需要自动配置bean,而Spring Boot不提供支持,我们可以自定义自动配置。
5) 生产前应用监控
Spring Boot 提供基于 http、ssh 和 telnet 的运行时项目的监控。
6) 无需代码生成和xml配置
Spring Boot的神奇之处不是通过代码生成来实现的,而是通过条件注释来实现的,这是Spring 4.x提供的新功能。 Spring 4.x提倡使用Java配置和注解配置相结合,而Spring Boot不需要任何xml配置即可实现所有Spring配置。
2.2 Spring Boot的优缺点
1)优点
快速构建项目。
免配置与主流开发框架集成。
项目可以独立运行,无需外部依赖Servlet容器。
提供运行时应用程序监控。
极大提高开发和部署效率。
与云计算自然集成。
2)缺点
版本迭代速度非常快,部分模块发生了较大变化。
由于不用自己配置,所以报错时很难定位。
网上现成的解决方案相对较少。
2.3 spring-boot-starter-jdbc和数据访问
大多数Java应用程序都需要访问数据库,尤其是服务层,因此SpringBoot会自动为我们配置相应的数据访问设施。
如果我们希望SpringBoot自动为我们配置数据访问基础设施,那么我们需要直接或间接依赖spring-jdbc。一旦 spring-jdbc 位于我们 SpringBoot 应用程序的类路径中,它将触发与数据访问相关的自动配置行为。最简单最好的方法是添加 spring-boot-starter-jdbc 作为应用程序的依赖项。
默认情况下,如果我们不配置任何DataSource,SpringBoot会自动为我们配置一个基于嵌入式数据库的DataSource。这种自动配置的行为其实非常适合测试场景,但是对于实际开发来说帮助不大。基本上我们会自己配置一个DataSource实例,或者通过自动配置模块提供的配置参数来自定义DataSource实例。
假设我们的SpringBoot应用只依赖一个数据库,那么使用DataSource自动配置模块提供的配置参数是最方便的:
spring.datasource.url=jdbc:mysql://{database host}:3306/{databaseName}
spring.datasource.username={database username}
spring.datasource.password={database password}
当然,自己配置一个DataSource也是可以的,SpringBoot也会智能选择我们自己配置的DataSource实例(但确实没有必要)。
除了自动配置DataSource之外,SpringBoot还会自动配置相应的JdbcTemplate、DataSourceTransactionManager等相关“设施”。可以说服务很周到。我们只需要在使用它的地方注入它即可:
class Aaa {
@Autowired
JdbcTemplate jdbcTemplate;
public <T> List<T> queryForList(String sql){
// ...
}
// ...
}
然而,spring-boot-starter-jdbc及其相关的自动配置并不总是带来便利。在某些场景下,我们可能需要在一个应用程序中依赖和访问多个数据库,这时候就会出现问题。 。
假设我们在ApplicationContext中配置多个DataSource实例来指向多个数据库:
@Bean
public DataSource dataSource1() throws Throwable {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(...);
dataSource.setUsername(...);
dataSource.setPassword(...);
// TODO other settings if necessary in the future.
return dataSource;
}
@Bean
public DataSource dataSource2() throws Throwable {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(...);
dataSource.setUsername(...);
dataSource.setPassword(...);
// TODO other settings if necessary in the future.
return dataSource;
}
好吧,抱歉,启动SpringBoot应用时会抛出类似如下的异常:
Exception):No qualifying bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2
为了避免这种情况的发生,我们需要在SpringBoot的启动类上做一些“手脚”:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class })
public class UnveilSpringChapter3Application {
public static void main(String[] args) {
SpringApplication.run(UnveilSpringChapter3Application.class, args);
}
}
也就是说,这种场景下我们需要排除SpringBoot提供的DataSource相关的自动配置。但如果我们仍然想享受 SpringBoot 提供的 DataSource 自动配置功能,我们还可以通过将 org.springframework.context.annotation.Primary Annotation 添加到 DataSource 配置之一来实现两全其美:
@Bean
@Primary
public DataSource dataSource1() throws Throwable {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(...);
dataSource.setUsername(...);
dataSource.setPassword(...);
// TODO other settings if necessary in the future.
return dataSource;
}
@Bean
public DataSource dataSource2() throws Throwable {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(...);
dataSource.setUsername(...);
dataSource.setPassword(...);
// TODO other settings if necessary in the future.
return dataSource;
}
}
除此之外,SpringBoot还提供了很多其他与数据访问相关的自动配置模块,比如spring-boot-starter-data-jpa、spring-boot-starter-data-mongodb等,你可以根据自己的具体情况选择使用这些数据访问场景。自动配置模块。
如果选择了spring-boot-starter-data-jpa等关系型数据库相关的数据访问自动配置模块,并且还需要依赖同时访问多个数据库,那么还需要排除这些自动配置模块在SpringBoot启动类中进行相应的修改。 AutoConfiguration实现类(对应spring-boot-starter-data-jpa是JpaRepositoriesAutoConfiguration),或者将一个DataSource标记为@Primary。
3. 前端编码规范 3.1 基本原理
符合Web标准(UTF-8、HTML5)、语义HTML(HTML5的新要求,减少div、span等无特定语义的标签的使用)、结构表现行为(HTML-CSS-JS代码分离、不同行为代码高内聚力 低内聚力
耦合),兼容性极佳(兼容早期版本的浏览器,兼容移动和PC设备)。页面性能方面(减少请求次数,如使用sprites、sass语法),代码需要简洁、清晰、有序,尽可能减少服务器负载,保证最快的解析速度(减少repaint和回流)。
3.2 文件命名约定
1. HTML、css、js、lib、images文件都存放在项目目录下。如果使用相关前端框架,根据
框架的文件格式布局正确。
2.所有文件夹和文件使用英文名称(避免使用中文路径)。
3、HTML文件:入口文件使用index.html。如果设计团队有相应的设计稿,则相应的设计稿和html文件必须命名相同并合理存储。
4、CSS文件命名:后缀.css。常用initial.css、初始化base.css、首页index.css,其他页面根据对应的HTML命名。
5、js文件命名:文本命名,后缀js.common.js,初始化base.js。其他页面根据相应的HTML命名。
3.3 HTML规范
1.文档类型声明和编码:统一为html5声明类型。使用IDE实现书写时分层缩进(默认
缩进 4 个空格)。
2.除非有特殊情况,CSS文件应该放在body部分标签之后。除非有特殊情况,大多数JS文件应该放在标签的末尾(如果需要在界面加载之前执行代码,可以放在head标签之后),以避免内联JS和CSS代码。
3.所有编码需要遵循HTML(XML)标准。标签&属性&属性名称必须由小写字母和下划线数字组成,所有标签必须闭合,包括br()、hr()等。属性值使用双引号。
4.引入JS库文件。文件名必须包含库名称和版本号以及是否是压缩版本,例如jquery-1.4.1.minjs。引入插件时,文件名格式为库名+插件名,如jQuery.bootstrap.js。
5. 编写页面时,请考虑向后扩展性。 class&id请参考CSS书写规范。
6、当需要给html元素添加自定义属性时,首先要考虑是否有合适的默认标签可以设置。如果没有,可以使用“data-”作为前缀添加自定义属性,避免使用“data:”等命名方式。
7. 语义 HTML。例如,标题根据重要性使用h*(同一页面只能有一个h1),段落标记使用p,列表使用ul。
块级元素不能嵌套在内联元素中。
8、尽可能减少div的多级嵌套。
9. 写链接地址时一定要避免重定向,例如:href="http://myVue.com/",即必须在URL中
地址后添加“/”;
10、尽量避免在页面上使用style属性,即“style=...”。
11、描述性表单元素(input、textarea)必须添加标签,如name:写为:name:
12、可以作为背景呈现的图片尽量写成css样式。
13、重要图片必须添加alt属性。为重要元素和被截断的元素添加标题。
14.给块代码和重要函数(如循环)添加注释,方便后台添加函数。
15.特殊符号的使用:尽可能使用代码替换:如)&space()&>(>)等。
3.4 CSS规范
1、编码规范为utf-8。
2.协同开发和分工:我会根据每个模块和页面相似性程序提前编写一个实体框架文件,并分配给前端人员来实现内部结构和性能和行为。共享的css文件base.css是由i编写的。在协同开发过程中,每个页面都必须导入。该文件包含重置以及标题和底部样式。该文件不能随意修改。
3、class和id的使用:id是唯一的,属于父级,class可以重复,属于子级,所以id只在大模块中使用,class可以在高复用和子级模块中使用。 。原则上,id是我在分发框架文件时命名的,除了为JS保留的钩子。
4. 为JS保留的hook命名时,请以js_开头,例如:js_ hide、js_ show。
5、类和id命名: header/footer/wrapper/left/right等大型框架名称统一用2中的i命名。其他样式名称采用小写英文和数字组合命名,如 i_ comment、 fontred 、宽度200。避免使用汉语拼音,尽量使用简单的单词组合。简而言之,命名应该语义化、简洁。
6.避免class和id命名(这一点很重要,如果不懂请及时与我们沟通):
a) 通过从属书写来回避,示例参见 d。
b) 获取父元素的 id/class 命名部分并命名。请参阅 d 的示例。
c) 对于使用率较高的名称,请使用您自己的代号。
以下划线开头,例如 i_clear。
d) a 和 b 都适用于 2 内置框架的页面。如果要在 2 内置框架的页面代码中添加新的 div 元素,请遵循 a: ..., style 的命名规则写作:
#mainnav.firstnav{…}_按照b命名规则:…风格写法:.main_firstnav{…}
7、css属性的书写顺序建议遵循:布局定位属性->自身属性->文本属性->其他属性。本文可以根据自己的习惯来写,但尽量保证相似的属性写在一起。属性列表:布局定位属性主要有:
显示&列表-样式&位置(对应上、右、下、左)&浮动&清除&可见性
&溢出;其自身属性主要包括:width&height&margin&padding&border&background。
文本属性主要包括:color&font&text-decoration&text-align&vertical-align&white-
空间&
其他&内容。
8、写代码之前,提高样式的复用率。
9、充分利用HTML自身的属性和样式继承原则,减少代码量,例如:
日期可以显示在右侧
ul.ist li {
位置:相对
ul .list li span {
位置:绝对;右:0
10、样式表中的中文字体名称必须转换成unicode编码,避免编码错误时出现乱码。
11、背景图片请尽量使用精灵技术,以减少http请求。考虑到多人协同开发,按照模块制作精灵。
12、使用table标签时(尽量避免使用table标签),请不要使用
宽度/高度/单元格间距/单元格填充等表格属性直接定义性能。应尽可能使用表自动配置。
私有属性的单独结构和呈现,例如thead、tr、th、td、tbody、tfoot、colgroup、scope。
(cellspaing和cellpadding的css控制方法:table{border: 0. margin: 0. border-collapse:collapse.}tableth,tabletd{padding: 0.},我会在base.css文件中初始化表格样式)
13.避免使用ie8兼容软件。
14、使用png图片制作图片时,要求图片格式为png-8格式。如果png-8确实影响画质或者有半透明的效果,那么对于IE6就必须单独定义背景。
15.避免使用兼容性属性,例如text-shadowl|css3相关属性。
16.减少影响性能的属性的使用,例如position:absolutel|float。
17. 必须为大块样式添加注释,为小块添加适当的注释。
18、代码缩进及格式:建议单行书写。大家可以按照自己的习惯来,后期的优化会统一的。
3.5 JS编写标准
1、文件编码统一为UTF-8。编写过程中,每行代码末尾必须有一个分号。原则上所有功能均根据XXX项目的需求进行原生开发,避免从网上下载代码造成代码污染。
2.库介绍:原则上只介绍jQuery库。如果需要引入第三方库,必须与团队其他成员讨论决定。
3、变量命名:原生JS变量的驼峰命名法要求纯英文字母,且首字母必须小写,如myVue。 jQuery变量要求第一个字符为'_',其他规则与原生JS相同,例如:_myVue。另外,变量需要集中声明,避免全局变量。
4.类命名:首字母大写,使用驼峰式命名。比如MyVue。
5. 函数命名:驼峰命名,首字母小写。例如,myVue()。
6、命名语义化,尽量使用英文单词或其缩写。
7、尽量避免使用不兼容且消耗资源的方法或属性,如eval r()&innerText。
8、后期优化时,JS非注释汉字必须转换为unicode编码,避免编码错误时出现乱码显示。
9、代码结构清晰,添加适当的注释,提高函数复用性。
10、注意与html分离,减少回流,关注浏览器性能
3.6 图片规格
1、所有页面元素图片放在img文件夹下,测试图片放在demo文件夹下。
2. 图片格式gif/png/jpg。推荐使用webp文件格式并使用软件压缩图片。
3、所有名称必须为小写英文字母和数字的组合,不得含有汉字、空格、特殊字符;尝试使用易于理解的词语。
使其他团队成员更容易理解的词汇。另外,名称分为前半部分和后半部分,用下划线分隔,如
ad_ left01.giflbtn_ 提交.gif。
4。选择最小的图像格式和图像质量,同时确保视觉效果减少加载时间。
5。尝试避免使用半透明的PNG图像(如果使用,请参阅CSS规范的相关说明)。
6.使用CSS Sprite技术专注于小型背景图像或图标,以减少页面HTTP请求。但是,请确保在相应的PSD源图像中绘制参考线,然后将其保存到IMG目录。
3.7测试规格
建议使用Aptana-Sublime-Vim-Webrom进行开发和测试工具。您也可以根据自己的偏好选择,但必须遵循以下原则:
1。您不能将IDE的视图模式用于“绘制”代码。
2。IDE不能用于生成相关的功能代码。
B.编码必须格式化,例如凹痕。测试工具:只有Firefox&IE6&IE7&IE8将在开发的早期进行测试,并将在后期进行优化。
更改时添加Opera&Chrome&Safari。建议的测试订单:Firefox-> IE-> Opera-> Chrome-> Safari。
我是道路上的新手,我的驾驶技能不好。请帮我。希望您能为我提供很多支持,并祝大家都有光明的未来和很多钱。为了更好的明天,让我们一起努力工作!