C语言的设计模式有哪些?

网上有关“C语言的设计模式有哪些?”话题很是火热,小编也是针对C语言的设计模式有哪些?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。

最近不少同学都报名参加计算机考试,我们学的是C语言,今天小编就给大家普及一下关于C语言

知识,C语言的设计模式有哪些?

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言是由UNIX的研制者丹尼斯·里奇(Dennis Ritchie)于1970年 由 肯·汤普逊(Ken Thompson)所研制出的B语言的基础上发展和完善起来的。

C语言的设计模式-单一职责

通常的定义是只专注于做一件事和仅有一个引起它变化的原因。对于接口、实现、函数级别往往我们比较容易关注单一职责,大家谈的也比较多,但对于返回值、参数可能不会有太多的人关注。但往往就是这些不符合单一职责原则的设计可能导致一些很难发现的BUG。

正常情况下pBuf是新空间的地址没有任何问题,但我们考虑下如果分配失败了呢,pBuf会被赋值成NULL,pBuf原指向的地址空间就没有指针指向了,造成了内存泄露。这种问题往往很难定位。熟悉realloc机制的人可能对这个问题很不屑,认为高手不会犯这些错误。但我们可以想下有没有办法设计一个好的接口让菜鸟也写出不会出错的代码。

说实话学习C语言是非常有难度的,所以说想学C语言的朋友要认真啦。

对于一个较大的Git工程,你可能会想在多个仓库之间共享代码,不管这些代码是在多个不同产品间使用的项目共享库或是一些模板。Git通过子模块来实现这样的需求。子模块允许将其他代码仓库的克隆作为子目录放到一个父仓库(有时候也称为父项目)中。一个子模块也是一个独立的仓库,你可以像其他仓库一样执行commit,branch,rebase等等操作。

JGit提供了实现大部分Git子模块命令的API。我将在这儿给大家介绍这些API。

设置

本文中用到的代码片段将作为学习测试程序。简单的测试程序有助于理解第三方库是如何工作,以及如何使用新的API。你可以将这些测试程序看做是可控制的试验,帮助你更加直观地发现第三方代码是如何执行的。

除此之外,如果你保持编写测试程序,可以帮助你检验第三方代码的新版本。如果你的测试程序涵盖了如何调用这些库,那么第三方代码中不兼容的修改将会尽早展现出来。

回到之前的话题,所有的测试程序共享同一个设置,详细信息请查看源代码。现在有一个空的仓库,叫parent,以及另一个仓库叫library。测试程序中,library将会作为子模块添加到parent仓库中。library仓库初始化提交了一个readme.txt文件。测试程序中有一个setUp方法,用来创建这两个仓库,如下所示:

1

Git git = Git.init().setDirectory( "/tmp/path/to/repo" ).call();

这两个仓库用类型为Git的parent和library变量表示。该类封装了一个仓库并允许访问JGit的所有可用指令。就如较早之前我在这里中提到,每个Commnad类对应于一条原生的Git pocelain指令。调用一个指令需要用到生成器模式。举个例子,执行Git.commit()的结果实际上相当于一个CommitCommand。你可以提供一些必要的参数去调用它的call()方法,从而执行相应的指令。

添加一个子模块

第一步当然是在一个已有的仓库添加子模块。通过上面提到的setUp步骤,library仓库应当作为子模块添加到parent仓库的modules/library目录下。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

@Test

public void testAddSubmodule() throws Exception {

String uri

= library.getRepository().getDirectory().getCanonicalPath();

SubmoduleAddCommand addCommand = parent.submoduleAdd();

addCommand.setURI( uri );

addCommand.setPath( "modules/library" );

Repository repository = addCommand.call();

repository.close();

F?ile workDir = parent.getRepository().getWorkTree();

F?ile readme = new F?ile( workDir, "modules/library/readme.txt" );

F?ile gitmodules = new F?ile( workDir, ".gitmodules" );

assertTrue( readme.isF?ile() );

assertTrue( gitmodules.isF?ile() );

}

SubmoduleAddCommand对象需要知道两件事,第一是子模块从哪里克隆而来,第二是它应该存放在哪里。URI属性表示仓库库的克隆地址,这个克隆地址将会传递给clone命令。path属性则指定了相对于parent仓库根工作目录的路径,子模块将被存放在这个路径。这个指令执行之后,parent仓库的工作目录将会变成这样:

library仓库存放在modules/library目录下,而且它的工作目录树被检出。call()方法返回一个Repository对象,你可以把它当做一个常规的仓库来使用。这也意味着,你必须在程序中明确显式地关闭返回的仓库,以避免文件句柄泄露。

从上图我们可以看到,SubmoduleAddCommand做了一件事,它在parent仓库的根工作目录下创建了一个.git模块文件,并把它添加到索引中。

1

2

3

[submodule "modules/library"]

path = modules/library

url = git@example.com:path/to/lib.git

如果你打开过Git的配置文件,你会发现以上句法。这个文件列出了当前仓库的所有子模块。对于每个模块,文件中列出了它仓库URL地址以及本地路径。一旦commit并push了这个文件,克隆这个仓库的一方就知道哪里可以获取相应的子模块(稍后会详细讲解)。

列出子模块

当我们添加了一个子模块之后,我们可以会想知道,它是否对于父仓库来说是可知的。第一项测试中我们做了一个基础的检测,验证了某些文件和目录的存在。我们也可以使用一个API来列出一个仓库的子模块,如下所示:

1

2

3

4

5

6

7

8

9

10

11

@Test

public void testListSubmodules() throws Exception {

addLibrarySubmodule();

Map submodules

= parent.submoduleStatus().call();

assertEquals( 1, submodules.size() );

SubmoduleStatus status = submodules.get( "modules/library" );

assertEquals( INITIALIZED, status.getType() );

}

SubmoduleStatus命令返回了一个子模块的Map集合,其中键是子模块的路径,值是这个模块的状态值。通过以上代码我们能够验证子模块确实已经添加进去,而且它的状态是INITIALIZED的。这个命令还允许添加一个或多个路径来限制子模块状态。

说到状态,JGit的StatusCommand并非原生的Git指令。如果在执行指令时添加选项‐‐ignore-submodules=dirty,那么所有对子模块工作目录的修改都会被忽略。

更新子模块

子模块通常指向他们所在的仓库的一次特殊的提交。如果之后有人克隆了父仓库,他们也会获得与之完全相同的子模块状态,即便子模块的上游有新的提交。

为了修改子模块,你像一下代码一样明确地对其进行更新:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

@Test

public void testUpdateSubmodule() throws Exception {

addLibrarySubmodule();

ObjectId newHead = library.commit().setMessage( "msg" ).call();

File workDir = parent.getRepository().getWorkTree();

Git libModule = Git.open( new F?ile( workDir, "modules/library" ) );

libModule.pull().call();

libModule.close();

parent.add().addF?ilepattern( "modules/library" ).call();

parent.commit().setMessage( "Update submodule" ).call();

assertEquals( newHead, getSubmoduleHead( "modules/library" ) );

}

这个较长的代码片段中,首先第一件事就是提交一些东西到library仓库中(第四行),接着将子模块更新到最近的一次提交。

为了让这种更新持久化保存下来,子模块必须被提交(第10,11行)。这次提交在子模块的名下(例子中是modules/library)保存了此次更新的commit-id。最后,通常需要将修改push上去,使得他们对其他仓库可用。

在父仓库中更新对子模块的修改

将上游的提交拉取到父仓库中也会修改子模块的配置。然而子模块本身并不会自动得到更新。

SubmoduleUpdateCommand就是用来解决这个问题。使用这个命令并不需要指定其他参数,它会更新所有已注册的子模块。该命令会克隆缺失的子模块并检出其配置中指定的提交。就如其他子模块命令一样,这里也有一个addPath()方法,以保证只更新给定路径下的子模块。

克隆一个包含子模块的仓库

此时你可能已经掌握一个规律,所有对子模块的操作都是手动的。克隆一个包含子模块配置的仓库并不会默认克隆它的子模块。但是,CloneCommand命令有一个cloneSubmodules的属性,如果设置为true,那么将会克隆所有配置的子模块。从内部看,在对父仓库进行克隆之后,SubmoduleInitCommand和SubmoduleUpdateCommand命令会被递归地执行,并且父仓库的工作目录会被检出。

移除一个子模块

如果要移除一个子模块,你会希望可以这样写:

1

git.submoduleRm().setPath( ... ).call();

但是很不幸,不管是原生的Git或者JGit都没有提供内置的移除子模块的指令,希望将来会添加这样的指令,在这之前,我们必须手动去移除子模块。如果你滚动到removeSubmodule()方法你会发现这并不是一件复杂的事。

首先,各个子模块会从.gitsubmodules和.git/config配置文件中移除。其次,子模块的入口会从索引中被移除。最后,.gitsubmodules文件以及索引的修改会被提交,并且子模块的内容会从工作目录中删除。

遍历子模块

原生的Git提供了git submodule foreach命令为每个子模块执行一个shell指令。JGit并没有直接支持这样的指令,而是提供了SubmoduleWalk。该类可以用来迭代仓库中子模块。以下示例程序实现了为所有子模块拉取上游的提交。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

@Test

public void testSubmoduleWalk() throws Exception {

addLibrarySubmodule();

int submoduleCount = 0;

Repository parentRepository = parent.getRepository();

SubmoduleWalk walk = SubmoduleWalk.forIndex( parentRepository );

while( walk.next() ) {

Repository submoduleRepository = walk.getRepository();

Git.wrap( submoduleRepository ).fetch().call();

submoduleRepository.close();

submoduleCount++;

}

walk.release();

assertEquals( 1, submoduleCount );

}

通过next()方法walk对象可以指向下一个子模块,如果没有更多的子模块,该方法会返回false。使用SubmoduleWalk时,通过调用release()方法可以释放子模块相关的资源。再次强调,如果你获得一个子模块的仓库实例可别忘了关闭它。

SubmoduleWalk也可以用来获取子模块的详细信息。通过它的大部分getter方法可以访问到当前子模块的属性,诸如path,head,remote URL等等。

同步远程URL

从上面我们知道子模块的配置保存在父仓库根工作目录下的.gitsubmodules文件中。而至少,在.git/config文件中,我们可以重写覆盖子模块的远程URL。对于每个子模块,它们本身都有一个配置文件。那么反过来,每个子模块可以有另一个远程URL。SubmoduleSyncCommand命令可以用来将所有远程URL重置为.gitmodules中的配置。

综上所述,JGit对子模块的支持几乎与原生的Git一致。大部分Git指令都在JGit中实现了,或可以通过一些途径进行仿真。如果你发现一些操作缺失或实现不了,可以去友好且帮得上忙的JGit社区去寻求帮助。

关于“C语言的设计模式有哪些?”这个话题的介绍,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!

本文来自作者[南宫星瑶]投稿,不代表拍拍号立场,如若转载,请注明出处:https://pvcpile.com/wiki/202501-692.html

(14)

文章推荐

  • Dell 电脑出故障怎么办?Dell 维修电话是多少?

    Dell电脑出故障怎么办?Dell维修电话是多少?Dell电脑出故障怎么办?如果Dell电脑出现故障,可以采取以下步骤:首先,可以尝试重启电脑,有时候一些小问题可能通过重启就能解决。检查是否有硬件连接问题,如电源线、显示器线等是否松动。查看电脑是否有报错信息或提示,根据

    2025年01月04日
    13
  • .社区健康教育的主要内容有哪些-

    网上有关“.社区健康教育的主要内容有哪些?”话题很是火热,小编也是针对.社区健康教育的主要内容有哪些?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。一、建立健全组织领导机构,成立开源社区健康教育领导小组,由社区书记亲自抓、负总责,并指派一名专职人员管理。二、

    2025年01月05日
    11
  • 梁咏琪个人资料有哪些?她的演艺生涯是怎样的

    梁咏琪个人资料有哪些?她的演艺生涯是怎样的梁咏琪个人资料:梁咏琪(GigiLeung),1976年3月25日生于香港,是中国香港的女歌手、音乐创作人、影视演员。梁咏琪的演艺生涯:她在学生时代就被星探发掘,之后与刘德华合演了电影《烈火战车》,开始了演艺之路。梁咏

    2025年01月05日
    9
  • 如何制作美味辣酱?辣酱制作方法有哪些?

    如何制作美味辣酱?辣酱制作方法有哪些?制作美味辣酱(1)准备材料新鲜的红辣椒(根据个人口味选择辣度)、大蒜、生姜、盐、糖、生抽、食用油等。(2)处理食材将红辣椒洗净晾干,去蒂切碎;大蒜和生姜切末备用。(3)炒制过程锅中倒入适量食用油,油热后放入蒜末和姜末煸炒出

    2025年01月06日
    9
  • 熏鱼怎么做才好吃?熏鱼的详细做法步骤

    熏鱼怎么做才好吃?熏鱼的详细做法步骤熏鱼怎么做才好吃熏鱼是一道具有独特风味的菜肴。以下是一种熏鱼的常见做法:食材准备:新鲜鱼(如草鱼、青鱼等)、葱姜蒜、料酒、生抽、老抽、白糖、盐、五香粉、八角、桂皮、香叶等。步骤:1.将鱼处理干净,切成适当大小的块状。2.鱼块

    2025年01月07日
    9
  • 华为 P6S 性能怎么样?有哪些独特优势呢

    华为P6S性能怎么样?有哪些独特优势呢华为P6S性能怎么样华为P6S在性能方面表现较为出色。(1)它搭载了四核处理器,能够流畅运行各种应用程序和游戏。(2)具备一定的图形处理能力,在显示效果和画面流畅度上有较好的保障。有哪些独特优势呢华为P6S具有

    2025年01月09日
    9
  • 沈阳二手车网有哪些靠谱的?如何选择合适的?

    沈阳二手车网有哪些靠谱的?如何选择合适的?沈阳二手车网有哪些靠谱的?如何选择合适的?目前,沈阳有一些比较知名且相对靠谱的二手车网,如58同城二手车、瓜子二手车等。在选择二手车网时,需要考虑以下几个方面:(1)信誉和口碑:了解该网站在市场上的声誉和用户的评价。(

    2025年01月10日
    5
  • 哈利波特魔法咒语有哪些?如何正确使用它们?

    哈利波特魔法咒语有哪些?如何正确使用它们?哈利波特魔法咒语有哪些?《哈利·波特》系列中有许多神奇的魔法咒语,以下是一些常见的:-**悬浮咒(羽加迪姆勒维奥萨)**:可以使物体漂浮在空中。-**缴械咒(除你武器)**:能使对方的魔杖脱手。-**火焰熊熊**:能产生火焰。-

    2025年01月10日
    4
  • 赤峰人才考试信息网怎么用?有哪些重要信息可获取?

    赤峰人才考试信息网怎么用?有哪些重要信息可获取?赤峰人才考试信息网怎么用赤峰人才考试信息网是一个提供各类人才考试相关信息的平台。1.首先,打开网站后,可以在首页上查看最新的招考公告、招聘信息等。2.通过导航栏,可以找到不同类型考试的专门板块,如公务员考试、事业单位考试等,

    2025年01月10日
    4
  • 联想电脑安装 Windows7 旗舰版有哪些要求?如何进行安装操作?

    联想电脑安装Windows7旗舰版有哪些要求?如何进行安装操作?联想电脑安装Windows7旗舰版有哪些要求处理器:1GHz或更快的32位(x86)或64位(x64)处理器。内存:1GB(32位)或2GB(64位)。硬盘空间:16GB(32位操作系统)或2

    2025年01月10日
    5

发表回复

本站作者后才能评论

评论列表(4条)

  • 南宫星瑶
    南宫星瑶 2025年01月11日

    我是拍拍号的签约作者“南宫星瑶”!

  • 南宫星瑶
    南宫星瑶 2025年01月11日

    希望本篇文章《C语言的设计模式有哪些?》能对你有所帮助!

  • 南宫星瑶
    南宫星瑶 2025年01月11日

    本站[拍拍号]内容主要涵盖:生活百科,小常识,生活小窍门,知识分享

  • 南宫星瑶
    南宫星瑶 2025年01月11日

    本文概览:网上有关“C语言的设计模式有哪些?”话题很是火热,小编也是针对C语言的设计模式有哪些?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。最...

    联系我们

    邮件:拍拍号@sina.com

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注我们