2018-01-12 折线图、成员变量和类变量的区别、C#性能优化总结- String 操作、 iOS 输入框高度随输入实时变化效果、前端框架与库的区别

第一组:姚成栋 折线图

由于无法上传文件
相关文件见群文件


第二组:赵彩凤 成员变量和类变量的区别

由static修饰的变量称为静态变量,其实质上就是一个全局变量。如果某个内容是被所有对象所共享,那么该内容就应该用静态修饰;没有被静态修饰的内容,其实是属于对象的特殊描述。

不同的对象的实例变量将被分配不同的内存空间, 如果类中的成员变量有类变量,那么所有对象的这个类变量都分配给相同的一处内存,改变其中一个对象的这个类变量会影响其他对象的这个类变量,也就是说对象共享类变量。

成员变量和类变量的区别:

1. 两个变量的生命周期不同

成员变量随着对象的创建而存在,随着对象的回收而释放。

静态变量随着类的加载而存在,随着类的消失而消失。

2. 调用方式不同

成员变量只能被对象调用。

静态变量可以被对象调用,还可以被类名调用。

3. 别名不同

成员变量也称为实例变量。

静态变量也称为类变量。

4. 数据存储位置不同

成员变量存储在堆内存的对象中,所以也叫对象的特有数据。

静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。

static 关键字,是一个修饰符,用于修饰成员(成员变量和成员函数)。

特点:
  1. 想要实现对象中的共性数据的对象共享。可以将这个数据进行静态修饰。

  2. 被静态修饰的成员,可以直接被类名所调用。也就是说,静态的成员多了一种调用方式。类名.静态方式。

  3. 静态随着类的加载而加载。而且优先于对象存在。

弊端:
  1. 有些数据是对象特有的数据,是不可以被静态修饰的。因为那样的话,特有数据会变成对象的共享数据。这样对事物的描述就出了问题。所以,在定义静态时,必须要明确,这个数据是否是被对象所共享的。

  2. 静态方法只能访问静态成员,不可以访问非静态成员。

    因为静态方法加载时,优先于对象存在,所以没有办法访问对象中的成员。

  3. 静态方法中不能使用this,super关键字。

    因为this代表对象,而静态在时,有可能没有对象,所以this无法使用。

转自http://www.runoob.com/java


第三组:蔡永坚 C#性能优化总结- String 操作

1.2.1 使用 StringBuilder 做字符串连接

String 是不变类,使用 + 操作连接字符串将会导致创建一个新的字符串。如果字符串连接次数不是固定的,例如在一个循环中,则应该使用 StringBuilder 类来做字符串连接工作。因为 StringBuilder 内部有一个 StringBuffer ,连接操作不会每次分配新的字符串空间。只有当连接后的字符串超出 Buffer 大小时,才会申请新的 Buffer 空间。典型代码如下:

  StringBuilder sb = new StringBuilder( 256 ); 
       for ( int i = 0 ; i < Results.Count; i ++ ) 
       { 
       sb.Append (Results[i]); 
       } 

如果连接次数是固定的并且只有几次,此时应该直接用 + 号连接,保持程序简洁易读。实际上,编译器已经做了优化,会依据加号次数调用不同参数个数的 String.Concat 方法。例如:

        String str = str1 + str2 + str3 + str4; 

会被编译为 String.Concat(str1, str2, str3, str4)。该方法内部会计算总的 String 长度,仅分配一次,并不会如通常想象的那样分配三次。作为一个经验值,当字符串连接操作达到 10 次以上时,则应该使用 StringBuilder。

这里有一个细节应注意:StringBuilder 内部 Buffer 的缺省值为 16 ,这个值实在太小。按 StringBuilder 的使用场景,Buffer 肯定得重新分配。经验值一般用 256 作为 Buffer 的初值。当然,如果能计算出最终生成字符串长度的话,则应该按这个值来设定 Buffer 的初值。使用 new StringBuilder(256) 就将 Buffer 的初始长度设为了256。

1.2.2 避免不必要的调用 ToUpper 或 ToLower 方法

String是不变类,调用ToUpper或ToLower方法都会导致创建一个新的字符串。如果被频繁调用,将导致频繁创建字符串对象。这违背了前面讲到的“避免频繁创建对象”这一基本原则。

例如,bool.Parse方法本身已经是忽略大小写的,调用时不要调用ToLower方法。
另一个非常普遍的场景是字符串比较。高效的做法是使用 Compare 方法,这个方法可以做大小写忽略的比较,并且不会创建新字符串。

还有一种情况是使用 HashTable 的时候,有时候无法保证传递 key 的大小写是否符合预期,往往会把 key 强制转换到大写或小写方法。实际上 HashTable 有不同的构造形式,完全支持采用忽略大小写的 key: new HashTable(StringComparer.OrdinalIgnoreCase)。

1.2.3 最快的空串比较方法

将String对象的Length属性与0比较是最快的方法:if (str.Length == 0)
其次是与String.Empty常量或空串比较:if (str == String.Empty)或if (str == "")

注:C#在编译时会将程序集中声明的所有字符串常量放到保留池中(intern pool),相同常量不会重复分配。


第四组:张元一 iOS 输入框高度随输入实时变化效果

本效果实现可分为两步:

  1. 根据文本长度和字体计算TextView高度
  2. 根据TextView高度实时改变TableViewCell高度

计算textview高度:

(float) heightForTextView: (UITextView *)textView WithText: (NSString *) strText{
  CGSize constraint = CGSizeMake(textView.contentSize.width , CGFLOAT_MAX);
  CGRect size = [strText boundingRectWithSize:constraint
                                      options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                   attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:14]}
                                      context:nil];
  float textHeight = size.size.height+22;
 
  return textHeight;
}

设置代理,监听textview高度:

cell.textview.delegate = self;

Cell高度设置为自适应:

(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return  UITableViewAutomaticDimension;
}

改变Cell的frame及后面Cell的坐标整体下移:

[UIView animateWithDuration:0.5 animations:^{
        
        for (MyTableViewCell *ce in array) {
            CGRect frame1 = ce.frame;
            frame1.origin.y += fl;
            ce.frame = frame1;
        }
     
    } completion:nil];
    [UIView animateWithDuration:0.5 animations:^{
        textView.frame = frame;
        cell.frame = framex;
} completion:nil];

具体实现代码在GitHub上:
https://github.com/Frued/CustomTableView


第五组:陈孚楠 前端框架与库的区别

框架就是提供了前端项目整体解决方案。库就是自己组合来实现项目。

某种层面上来说,前端库就像我平时家里的工具箱,里面有起子、锤子,我们可以通过这个工具箱来给小孩子创造玩具,我们甚至可以自己创造一些工具,方便我们日后创造玩具。而框架,更像是我们在淘宝上买好了车的骨架,回来后拼装好了,可以根据自己的需要,贴上不同的贴纸,喷上不同的颜色,我们跟其他使用框架的人,拿到手上的玩具骨架都是一样的,我们很难自己去改变。

前端基于JS的框架(frameworks)/库(librarys)更是层出不穷,且各自都有其自身的优势以及劣势,有些是向开发使用者提供整套的服务,比如MVC一整套,有些则是专注于某一个点,比如专注于dom操作或异步请求;

框架与库之间最本质区别在于控制权:you call libs, frameworks call you(控制反转)

库:库是更多是一个封装好的特定的集合,提供给开发者使用,而且是特定于某一方面的集合(方法和函数),库没有控制权,控制权在使用者手中,在库中查询需要的功能在自己的应用中使用,我们可以从封装的角度理解库;

框架:框架顾名思义就是一套架构,会基于自身的特点向用户提供一套相当于叫完整的解决方案,而且控制权的在框架本身,使用者要找框架所规定的某种规范进行开发。

在实际中,像angular、backbone、vue就属于框架,而jQuery、react、underscore就是库,在前者中我们完全可以自由的使用后者,同时也可以没有前者的基础之上使用后者,都是很自由,控制权始终在我们的手中,但是使用框架时候就必须按照它的规范来进行模块化的开发;

库、插件、组件、控件、扩展

组件本质:封装。一定程度上可以约等于模块化,调用者只需关注输入和输出,总思想就是分而治之、重复利用。低耦合;

组件解决资源整合问题、增强功能促进开发效率。提高可维护性,便于协同开发,每个模块都可以分拆为一个组件,例如异步请求组件,路由组件,各个视图组件。

  • 库:为解决某种特定需求的程序功能集合;即library,如jQuery,常用于方便dom操作、解决浏览器兼容等问题。

  • 插件:参与程序内部运行环节的一段或多段代码集合;即Plugin,遵循一定规范写出来方便程序展示效果,拥有特定功能且方便调用。如轮播图和瀑布流插件,

  • 扩展:使用程序API扩展程序适用面的一段或多段代码集合;即Extension,

  • 组件:可重复使用并且可以和其他对象进行交互的对象;即Component,能复用的js代码其实跟插件差不多,区别可能就是插件专注于特定功能而组件更专注于复用吧。

  • 控件:提供或实现用户界面功能的组件,控件即组件,反之不一定。即Control,

组件(Component)是是一个含义很大的概念,一般是指软件系统的一部分,承担了特定的职责,可以独立于整个系统进行开发和测试,一个良好设计的组件应该可以在不同的软件系统中被使用(可复用)。例如V8引擎是Chrome浏览器的一部分,负责运行javascript代码,这里V8引擎就可以视为一个组件。V8引擎同时也是Node.js的javascript解释器,这体现了组件的可复用性。

库(Library)是一系列预先定义好的数据结构和函数(对于面向对象语言来说,是类)的集合,程序员通过使用这些数据结构和函数实现功能。例如Moment.js是一个javascript库,提供了处理时间的一些函数。

框架(Framework)也是一系列预先定义好的数据结构和函数,一般用于作为一个软件的骨架,但程序真正的功能还需要由开发者实现。框架和库的最大区别在于“控制反转”,当你使用一个库,你会调用库中的代码,而当你使用一个框架,框架会调用你的代码。框架和库是一个有交叉的概念,很多框架都是以库的形式发布的,例如Java的Spring MVC框架,其发布的jar包本身就是一个库。而一个库如果也能通过依赖反转的方式进行扩展,那也可以视为一个框架,例如Python的markdonw解析库Python Markdown,可以添加自定义的解析扩展,那么可以被视为一个markdonw解析框架。

插件(Plugin)和扩展(extension)是两个很相似的概念,我没有办法在软件系统的角度给出这二者的区别。插件(或扩展)是对已有应用程序或者库的功能补充,一个软件的插件(或扩展)是实现了该软件预定义接口的组件,用来向已有的软件添加功能。插件在目标软件发布时可以不预先包含,而是在运行时被使用者注册,然后再被目标软件调用。另一个很接近的概念是加载项(Add-on),可以认为加载项是插件(或扩展)的子集,是仅针对应用程序来说的功能补充。一个插件的例子是Flash的浏览器插件,为浏览器实现了运行Flash程序的功能。

控件(Control)是gui编程的一个概念,一般来说一个最终用户可以看到的、可交互的组件,被称为一个控件。例如.NET编程中的System.Windows.Controls.Button是一个控件。

你可能感兴趣的:(2018-01-12 折线图、成员变量和类变量的区别、C#性能优化总结- String 操作、 iOS 输入框高度随输入实时变化效果、前端框架与库的区别)