软件工程2021:第2次作业—— 谈谈鸿蒙操作系统
关于鸿蒙操作系统
开发背景:
技术战爆发以后,芯片和操作系统受限,华为手机业务受到冲击,华为势必需要寻找新的突破点。
需求:
- 数字化新时代的到来需要新的操作系统;
- 5G物联网时代的到来对操作系统提出了新的要求;
- 中国迫切需求独立自主的研发操作系统;
- 人工智能兴起,AIoT场景天然要求多设备智能协同,需要一个适用于各类型机器的操作系统;
- 大数据与云计算需要一个能够提供多机互联的操作系统;
- 网络安全威胁呈现多元化、复杂化、频发高发趋势,需要一个足够安全的系统进行保障。
开发历史:
2012年,华为的自有操作系统开始进行规划;
2016年5月,消费者BG软件部立项研发分布式操作系统1.0版本;
2017年5月,分布式操作系统1.0版本研发完成,开始研发2.0版本;
2018年4月24日,自研分布式操作系统项目获得投资,成为消费者BG的正式项目;
2019年5月14日, “华为鸿蒙”商标注册公告;
2019年5月17日,华为正式发布了自主知识产权操作系统——鸿蒙;
2019年8月9日,华为正式发布鸿蒙系统;
2020年9月10日,鸿蒙系统升级至2.0版本,向内存128KB~128MB设备开源;
2021年4月,鸿蒙OS2.0向内存182MB~4GB设备开源;
2021年4月27日,华为鸿蒙OS2.0开发者公测版本大批量向已申请的开发者推送;
2021年5月9日,华为鸿蒙OS2.0开启第二轮公测。
应该场景:
鸿蒙系统的生态可以概括为1+8+N。1+8+N战略的核心是1 , 即智能手机。智能手机作为鸿蒙生态的核心部分,凭借华为海思自研的麒麟芯片,为其他设备终端提供相应的通信支撑。8是指PC、平板、智慧屏、音箱、眼镜、手表、车机、耳机,这8项将由华为公司亲自研发和参与市场,并且会追求市场领先地位。N是摄像头、扫地机、智能秤等外围智能硬件,涵盖移动办公、智能家居、运动健康、影音娱乐、智慧出行五大场景模式。
鸿蒙操作系统将打通手机、电脑、平板、电视、工业自动化控制、无人驾驶、车机设备、智能穿戴统一成一个操作系统,能兼容全部安卓应用的所有Web应用。鸿蒙OS架构中的内核会把之前的Linux内核、鸿蒙OS微内核与LiteOS合并为一个鸿蒙OS微内核,创造一个超级虚拟终端互联的世界,将人、设备、场景有机联系在一起。
关于鸿蒙是否套壳的争议
什么是创新:
正如雷军所说,创新就是做别人没做过的事情。华为自研操作系统鸿蒙是中国企业首次在操作系统方面取得重大的突破,在国产操作系统的自主创新之路踏出了坚定的一步。
创新具有很高的风险,特别是对公司和企业来说,创新需要承担很多风险因素和压力,因此创新在企业中日渐稀缺。华为开发了鸿蒙操作系统,实现了创新,这对一个大公司来说难能可贵。
代码复用与创新的关系:
在软件开发中代码复用情况是非常普遍的,判断这种代码复用是否是抄袭行为的标准,要根据被复用的代码版权协议。采用代码复用时只要遵守了对象代码的知识产权或分发协议,这种行为就不算是抄袭。因此,在此基础上实现开发,不能不被看作是创新。
在ASOP这个项目里,任何机构和企业都有义务为开源社区贡献代码,也能够使用和下载开源代码,并基于开源项目做二次开发。华为也是ASOP的重要贡献者,并且有权使用ASOP的代码。
再者,王成录透露,今年10月份鸿蒙OS的第三阶段开源代码就会上线,由谷歌贡献的代码几乎就没有了。对于鸿蒙OS,循序渐进才是最好的选择,当鸿蒙OS积蓄足够的实力时,就能完全抛开谷歌和ASOP了。
比较在手机上的体验,那鸿蒙OS并无突出的优势。但是当鸿蒙OS连接更多各种各样的设备时,鸿蒙OS的优势就体现出来了,这是iOS和安卓无法比拟的。这也是鸿蒙为下一个时代准备的创新。
代码风格分析
好的代码风格1 :
void PaContainer::OnCommand(const OHOS::AAFwk::Want &want, int startId, int32_t instanceId) { LOGI("OnCommand with id %{private}d", instanceId); auto container = AceEngine::Get().GetContainer(instanceId); if (!container) { LOGE("no pa container with id %{private}d", instanceId); return; } auto aceContainer = AceType::DynamicCast<PaContainer>(container); auto back = aceContainer->GetBackend(); if (back) { auto paBackend = AceType::DynamicCast<PaBackend>(back); if (paBackend == nullptr) { LOGE("DynamicCast paBackend failed with id %{private}d", instanceId); return; } paBackend->OnCommand(want, startId); } }
分析:函数、过程、结构缩进正确,函数、变量命名清晰明确,代码格式正确,无过长或一行有多条代码。
好的代码风格2:
if (f == ImageFormat.Jpeg.Guid || f == ImageFormat.Tiff.Guid || f == ImageFormat.Png.Guid || f == ImageFormat.Exif.Guid) { supportsPropertyItems = true; } else { supportsPropertyItems = false; }
分析:原本一个很长的条件表达式,通过在“||”运算符处换行,显得更加的清晰。
好的代码风格3:
public static string[] GetPhotoIds(string filterExpression, string sort, bool caseSensitive) { // 第一个逻辑段代码根据处理后的参数取得数据行 xml.Photos.CaseSensitive = caseSensitive; DataRow[] rows = xml.Photos.Select(filterExpression, sort ?? string.Empty); // 遍历数据行,取出需要的元素 string[] ids = new string[rows.Length]; for (int i = 0; i < rows.Length; i++) { ids = (string)rows["Id"]; } // 返回结果 return ids; }
分析:这个函数的目的是根据指定的筛选条件和排序规则返回照片的标识号,函数内部自然形成了三个逻辑段:先是根据要求取得原始数据,然后从原始数据中提取我们需要的部分,最后将结果返回。用空行将这三个逻辑区分隔开来将会更加有利于别人理解其思路。
不好的代码风格1:
package fitnesse.wikitext.widgets; import java.util.regex.*; public class BoldWidget extends ParentWidget { public static final String REGEXP = "'''.+?'''"; private static final Pattern pattern = Pattern.compile("'''(.+?)'''", Pattern.MULTILINE + Pattern.DOTALL ); public BoldWidget(ParentWidget parent, String text) throws Exception { super(parent); Matcher match = pattern.matcher(text); match.find(); addChildWidgets(match.group(1)); } public String render() throws Exception { StringBuffer html = new StringBuffer("</b>"); return html.toString(); } }
分析:没有垂直方向上的区隔,可读性差,缩进间隔不明显。
不好的代码风格2:
private static void Swap(object a, object b) { object temp; temp = a; a = b; b = temp; }
分析:把三条短语句凑在一行,看似没有影响,但是很容易让人看漏,且编译器总是按行来进行设计的,将多条语句写在一行会引起不必要的麻烦。
傻瓜都可以写出机器能读懂的代码,但只有专业程序员才能写出人能读懂的代码。作为专业程序员,每当写下一行代时,要记得程序首先是给人读的,其次才是给机器读的。