遗留项目中的重复代码删除策略

时间:2018-12-25 12:05:49

标签: c++ polymorphism variant

我最近开始从事旧项目。我可以看到以下格式的许多代码重复:

void somefunc(arg1,arg2,Type1 * Ptr) 
{
      //some logic
}

//在Type2上超载

void somefunc(arg1,arg2,Type2 * Ptr) 
{
         //same logic
}
  

这两个功能之间唯一的区别是类型的   第三个论点 Type1和Type2 源自 Type

类型在运行时确定。所以我尝试了这样的事情

void somefunc(arg1,arg2,Type * Ptr) 
{
    if (arg1.version > 14) 
        Type1 *ptr = dynamic_cast<Type1*>(Ptr);
    else
        Type2 *ptr = dynamic_cast<Type2*>(Ptr);

    //some logic using ptr
}

但是在运行时需要dynamic_cast来确定正确的类型。而且我必须使用if else块在很多地方更新代码。

Boost变体的想法。看起来与上述方法类似。

是否有一种更简单/优雅的方法来避免这种代码重复?

1 个答案:

答案 0 :(得分:2)

  

是否有一种更简单/优雅的方法来避免这种代码重复?

最简单的方法是将var objShell = WScript.CreateObject("WScript.Shell") 用作模板函数:

#Import Modules

from termcolor import colored
from selenium import webdriver
import requests
import os
import sys
import time

#Proxy Grab

options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://www.sslproxies.org/")
tbody = driver.find_element_by_tag_name("tbody")
cell = tbody.find_elements_by_tag_name("tr")
for column in cell:

        column = column.text.split(" ")
        print(colored(column[0]+":"+column[1],'yellow'))
driver.quit()
print("")

os.system('clear')
os.system('cls')

#Proxy Connection

print(colored('Getting Proxies from graber...','green'))
time.sleep(2)
os.system('clear')
os.system('cls')
proxy = {"http": "http://"+ column[0]+":"+column[1]}
url = 'https://mobile.facebook.com/login'
r = requests.get(url,  proxies=proxy)
print("")
print(colored('Connecting using proxy' ,'green'))
print("")
sts = r.status_code

因此,您可以使用somefunc()template <typename T> void somefunc(arg1,arg2,T* Ptr) { //some logic } 来调用somefunc(),而无需使用Type1确定它们:

Type2

  

类型在运行时确定。所以我尝试了这样的事情

dynamic_cast<>

由于Type1 a; Type2 b; somefunc(x,y,&a); // Uses Type1 somefunc(x,y,&b); // Uses Type2 仅在void somefunc(arg1,arg2,Type * Ptr) { if (arg1.version > 14) Type1 *ptr = dynamic_cast<Type1*>(Ptr); else Type2 *ptr = dynamic_cast<Type2*>(Ptr); //some logic using ptr } / ptr范围块中被声明为可见,因此将永远无法工作,并且您将需要再次复制逻辑。