fps meter使用教程_得墨meter耳定律及其使用方法

fps meter使用教程

得墨meter耳定律是有趣的编程原理。 这是我所知道的唯一一个具有近似数学的定义:

对象O的任何方法m只能调用以下类型的对象的方法:

  • O本身
  • m的参数
  • m内创建/实例化的任何对象
  • O的直接组成对象
  • 全局变量,可由O访问,范围为m

如果您没有意识到,此列表将不允许您调用任何允许的方法返回的任何方法。 它本质上禁止链接方法调用。 我会稍作一些例外。

为什么?

得墨meter耳定律的目的是什么? 它试图防止什么? Demeter定律旨在减少耦合并增加封装。 通过遵循迪米特法则,你让这个类Ø并不需要知道的比什么M做其他的源东西。 为了减少与m的耦合, O除了m的存在外,不应该对m的返回有任何了解。

我可能没有最好的解释。 走出去看看别人如何解释这不是一个坏主意。 这篇文章的真正目的是描述遵守法律的方式,一种反模式以及一些例外情况。

反模式

我们将从反模式开始。 我称其为“分层私有方法”,这是我第一次想到“绕过Demeter法则”,但我很快发现,尽管从技术上讲它遵循所给出的规则,但并未遵循该法则的原因。

反模式就是这样。 假设您最初有以下代码要修改以遵循Demeter:

public void m(Parameter parameter)
{
   ReturnValue result = parameter.method();
   result.method();
}

要解决此问题,请将其更改为:

public void m(Parameter parameter)
{
   otherMethod(parameter.method());
}

private void otherMethod(ReturnValue rv)
{
   rv.method();
}

如您所见,每种方法仍然遵循法律,但是类仍然是耦合的。 每当您从内部调用O的另一个方法时,都应考虑该调用方法中的代码是m的一部分,以便仍遵循Demeter定律的精神。

层数

那么,您应该怎么做才能修复代码? 在这种情况下,您可以将私有方法调用转换为对新类的调用:

public class NewClass
{
   public void extractedMethod(ReturnValue rv)
   {
      rv.method();
   }
}

所以m现在看起来像这样:

public void m(Parameter parameter)
{
   NewClass helper = new NewClass();
   helper.extractedMethod(parameter.method());
}

现在,这似乎是完全的浪费,创建了一个新类,该类实际上是私有方法的替代品。 但是,实际上,有很多人认为每个私有方法都应该成为一个新类。 虽然我同意我们的私有方法确实显示出超越它们所包含的类范围的趋势。 每当您看到私有方法时,请考虑从中提取一个类。

但是,这是打电话给那个班级的最好方法吗? 到目前为止,您应该了解依赖注入(如果不这样做,请进行查找;它非常简单,但是很重要)。 如果转移到类的调用非常复杂,以至于需要进行自己的测试,则应以自己认为最合适的方式应用DI。 如果没有,请考虑一下。 但是,除非您期望有多个实现,否则可能没有充分的理由立即执行此操作。

例外1:数据结构

m是数据结构上的方法或返回数据结构时,可以忽略Demeter定律。 数据结构是一类,其整体目的基于存储/表示数据。 这包括原始类型包装器,String,“ java bean”等。 可以理解的是,如果数据定义发生变化,则数据用户必须适应变化。 如果您调用的方法(违反了得墨meter耳法则)只是返回公共内部数据(数据本身可能是私有的,但是使用公共获取器),则没有充分的理由不允许这样做。

遵循以下准则,不可变对象也可能是违反法律的一部分:“错误”方法调用1)返回公共内部数据(如之前)或2)返回与自身类型相同的新对象。

数字2是安全的,因为方法调用等效于增加数字。 如果整数不具备使用运算符的能力,则假定对象是不可变的,则增量将与数字2( n = n.increment() )完全相同。

例外2:构建器模式和其他Fluent API

当一个API设计为流利的(因此通常是链接的)时,没有充分的理由要成为严格的Demeter遵循者法则而失去可读性。 例如,如果您不允许自己链接方法,那么Java 8的Stream API将一文不值。

奥托罗

希望您现在对Demeter定律的目的和用法有更好的了解。 现在开始编程! 玩得开心!

翻译自: https://www.javacodegeeks.com/2015/03/law-of-demeter-and-how-to-work-with-it.html

fps meter使用教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
avformat_find_stream_info 是 FFmpeg 中用于获取媒体文件音视频流信息的函数,它的原型如下: ``` int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options); ``` 其中,ic 是一个 AVFormatContext 结构体指针,表示要进行音视频流信息获取的媒体文件的格式上下文;options 是一个 AVDictionary 结构体指针,表示附加的选项参数,可选。 avformat_find_stream_info 函数的作用是获取媒体文件中的音视频流信息,并将信息存储在 AVFormatContext 结构体中。在调用此函数之后,可以通过遍历 AVFormatContext 结构体中的 streams 数组来获取每个音视频流的详细信息,包括编解码器参数、流的类型(音频或视频)、流的时长、帧率等。 使用 avformat_find_stream_info 函数时,需要先调用 avformat_open_input 函数打开要读取的媒体文件,并使用 avformat_alloc_context 函数创建一个 AVFormatContext 结构体。然后,可以使用 avformat_find_stream_info 函数获取音视频流信息。函数返回值表示是否获取成功,如果返回值小于 0,表示获取失败,可以通过 av_strerror 函数将错误码转换为错误信息进行查看。 下面是一个示例代码,演示了如何使用 avformat_find_stream_info 函数获取音视频流信息: ```c AVFormatContext *fmt_ctx = NULL; int ret = avformat_open_input(&fmt_ctx, "test.mp4", NULL, NULL); if (ret < 0) { // 打开媒体文件失败 return; } ret = avformat_find_stream_info(fmt_ctx, NULL); if (ret < 0) { // 获取音视频流信息失败 avformat_close_input(&fmt_ctx); return; } // 遍历音视频流信息 for (int i = 0; i < fmt_ctx->nb_streams; i++) { AVCodecParameters *codecpar = fmt_ctx->streams[i]->codecpar; if (codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { // 音频流信息 printf("Audio Stream: sample_rate=%d, channels=%d\n", codecpar->sample_rate, codecpar->channels); } else if (codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { // 视频流信息 printf("Video Stream: width=%d, height=%d, fps=%f\n", codecpar->width, codecpar->height, av_q2d(fmt_ctx->streams[i]->avg_frame_rate)); } } avformat_close_input(&fmt_ctx); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值