简化函数调用之三 :Remove Parameter(移除参数)

函数本体(method body)不再需要某个参数。

将该参数去除。

动机(Motivation)

程序员可能经常添加参数,却往往不愿意去掉它们。他们打的如意算盘是,无论如 何,多余的参数不会引起任何问题,而且以后还可能用上它。

这也是恶魔的诱惑,一定要把它从脑子里赶出去!参数指出函数所需信息,不同的参数值代表不同的意义。函数调用者必须为每一个参数操心该传什么东西进去。如果你不去掉多余参数,你就是让你的每一位用户多费一份心。这是很不划算的,尤其「去除参数」是非常简单的一项重构。

但是,对于多态函数(polymorphic method),情况有所不同。这种情况下,可能多态函数的另一份(或多份)实现码会使用这个参数,此时你就不能去除它。你可以添加一个独立函数,在这些情况下使用,不过你应该先检查调用者如何使用这个函数,以决定是否值得这么做。如果某些调用者已经知道他们正在处理的是 一个特定的subclass ,并且已经做了额外工作找出自己需要的参数,或已经利用对classes 体系的了解来避免取到null ,那么就值得你建立一个新函数,去除那多余参数。如果调用者不需要了解该函数所属的class ,你也可以保持调用者无知(而幸福)的状态。

作法(Mechanics)

Remove Parameter 的作法和Rename Method 、Add Parameter 非常相似。

·检查函数签名式(signature)是否被superclass 或如subclass 实现过。如果是,则需要针对每份实现品分别进行下列步骤。

·声明一个新函数,名称与原函数同,只是去除不必要的参数。将旧函数的代码拷贝到新函数中。
Ø如果需要去除的参数不止一个,将它们一次性去除比较容易。

·编译。

·修改旧函数,令它调用新函数。
Ø如果只有少数几个地方引用旧函数,你大可放心地跳过这一步骤。

·编译,测试。

·找出旧函数的所有被引用点,将它们全部修改为对新函数的引用。每次修改后,编译并测试。

·删除旧函数。
Ø如果旧函数是class public 接口的一部分,你可能无法安全地删除它。 这种情况下,将它保留在原处,并将它标记为"deprecated"(不再被赞同)。

·编译,测试。

由于我可以轻松地添加、去除参数,所以我经常一次性地添加或去除必要的参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C# 中调用 C++ DLL 函数的时候,如果函数参数是 std::string 类型,需要进行一些特殊的处理。因为在 C++ 中,std::string 类型实际上是一个类,而在 C# 中没有对应的类型。 一种解决方案是,将 C++ 函数参数中的 std::string 类型改为 char* 类型,并且增加参数来指定字符串的长度。在 C# 中,可以使用 Marshal 类的各种方法来将字符串转换为 char* 类型,并将字符串的长度传递给 C++ 函数。 下面是一个示例代码,演示了如何在 C# 中调用一个 C++ DLL 函数,该函数参数类型为 std::string: C++ DLL 函数的代码: ```c++ #include <string> #include <iostream> // 定义一个使用 std::string 作为参数函数 void printString(std::string str) { std::cout << str << std::endl; } ``` 在 C# 中调用函数的代码: ```c# using System; using System.Runtime.InteropServices; class Program { // 声明 C++ DLL 函数 [DllImport("MyCppLib.dll", CallingConvention = CallingConvention.Cdecl)] static extern void printString([MarshalAs(UnmanagedType.LPStr)] string str, int length); static void Main(string[] args) { // 要传递给 C++ DLL 函数的字符串 string myString = "Hello, world!"; // 将字符串转换为 char* 类型,并获取字符串的长度 byte[] strBytes = System.Text.Encoding.ASCII.GetBytes(myString); int strLength = strBytes.Length; // 调用 C++ DLL 函数 printString(myString, strLength); } } ``` 在 C# 中,使用 [MarshalAs(UnmanagedType.LPStr)] 特性将 C++ 函数参数中的 std::string 类型转换为 char* 类型,使用 System.Text.Encoding.ASCII.GetBytes() 方法将字符串转换为 byte[] 类型,并使用该数组的长度作为字符串的长度参数传递给 C++ 函数。 希望这个示例代码对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值