結對編程——初讀隊友代碼
隊友的個人項目是在pycharm環境下用python寫的,共分為三個模塊:Users;fouroperate;GUIapp,他們的功能分別如下:
GUIapp:主控制臺模塊,控制用戶輸入密碼修改等級,輸入信息等,加入了界面,可生成exe文件(這點真的超級棒,似乎花了隊友大量的時間進行額外的學習,這點值得我學習)。
Users:用戶信息模塊,存儲用戶名、密碼狀態等。
fouroperate:控制表達式產生的模塊。
代碼優點分析:
1、註釋清晰,在每個代碼模塊前、每個類、函數之前都有註釋說明該模塊的功能,代碼的可讀性強;
2、用戶信息采用類的形式存在數組中,便於添加和刪除用戶信息,也便於增加每個用戶的信息內容(我代碼的登錄模塊采取的是if else式的判斷方式,可擴展性太差,對後續用戶信息的更改和添加十分不友好);
#初始化用戶庫信息 g_u = [] #等級1 g_u.append(Users("張三1",123,0)) g_u.append(Users("張三2",123,0)) g_u.append(Users("張三3",123,0)) #等級2 g_u.append(Users("李四1",123,1)) g_u.append(Users("李四2",123,1)) g_u.append(Users("李四3",123,1)) #等級3 g_u.append(Users("王五1",123,2)) g_u.append(Users("王五2",123,2)) g_u.append(Users("王五3",123,2))
3、生成了界面,為接下來的結對編程提供了許多便利(雖然這個QQ的圖片著實是不太好看,後續有待更改制作更好看的界面);
代碼缺點分析:
1、生成括號的時候采取的是一種偽隨機的形式(我覺得不ok),該算法是層層往外加每一個式子的,在前兩個操作數上判斷是否加括號然後隨機交換式子中前後部分的順序,因為這樣不會出現並列括號的形式,所以額外對有四個和五個操作數的情況判斷,增加這種括號出現的情況;
#隨機生成小學難度等式,僅有加減乘除與括號 def create_pripro(self): for c in range(self.num_problem): str1= self.create_num() str2 = self.create_num() op = self.create_op() problem = self.combine2num(str1,str2,op) count = random.randint(0,3) #判斷是否進行變形,加括號 if(count>0): for j in range(count): op = self.create_op() str1 = problem str2 = self.create_num() change = random.randint(0,1) if change == 0 : str1 = ‘(‘+str1+‘)‘ change = random.randint(0,1) if change == 0 : temp = str1 str1 = str2 str2 = temp problem = self.combine2num(str1,str2,op) #查重語句 repet = self.read_txtname(problem) if repet == 0: self.problems.append(problem) #處理括號平行情況 if(count == 4): str3 = self.create_num() str4 = self.create_num() op = self.create_op() problem2 = self.combine2num(str3,str4,op) problem = ‘(‘+problem+‘)‘+self.create_op()+‘(‘+problem2+‘)‘ # 查重語句 repet = self.read_txtname(problem) if repet == 0: self.problems.append(problem) if(count == 5): str3 = self.create_num() str4 = self.create_num() str5 = self.create_num() choice = random.randint(0,1) if(choice == 0): problem2 = str3 + self.create_op() + str4 + self.create_op() + str5 change = random.randint(0, 1) if change == 0: temp = problem problem = problem2 problem2 = temp problem = ‘(‘+problem+‘)‘+self.create_op()+‘(‘+problem2+‘)‘ if (choice == 1): problem2 = str3 + self.create_op() + str4 change = random.randint(0, 1) if change == 0: temp = problem problem = str5 str5 = temp problem = ‘(‘+problem+‘)‘+self.create_op()+‘(‘+problem2+‘)‘+self.create_op()+str5
2、在初中和高中控制高級操作符的產生時沒能全部隨機考慮到所有的可能情況,還是采取類似加括號的那種方式,並不是真隨機,同時,在處理控制至少產生一個高級操作符的時候,沒有控制好,沒能實現這個需求,在測試中產生了 5+2= 這樣的高中題目,令人發指;
def create_highpro(self): for h in range(self.num_problem): str1 = self.create_num() str2 = self.create_num() op = self.create_op() problem = self.combine2num(str1,str2,op) count = random.randint(0,3) #判斷是否進行變形,加括號 if(count>0): for j in range(count): flagc = 0 flaga = 0 op = self.create_op() str1 = problem str2 = self.create_num() #flaga控制產生至少一個括號 if flaga == 0: change = 0 flaga == 1 elif flaga == 1: change = random.randint(0,1) if change == 0 : str1 = ‘(‘+str1+‘)‘ #此處判斷加入哪一種三角函數 #flagc控制必須每道題目產生一個三角函數 if flagc == 0: trifchange = random.randint(0,2) flagc = 1 elif flagc == 1: trifchange = random.randint(0, 10) if trifchange == 0: str1 = "sin"+str1 elif trifchange == 1: str1 = "cos"+str1 elif trifchange == 2: str1 = "tan"+str1 #此處判斷是否開平方或者平方 middchange = random.randint(0,5) if middchange == 1: str1 = "√"+str1 elif middchange == 2: str1 = str1 + "^2" change = random.randint(0,1) if change == 0 : temp = str1 str1 = str2 str2 = temp problem = self.combine2num(str1,str2,op) self.problems.append(problem) # 查重語句 repet = self.read_txtname(problem) if repet == 0: self.problems.append(problem) else: trifchange = random.randint(0, 2) if trifchange == 0: problem = "sin" + problem elif trifchange == 1: problem = "cos" + problem elif trifchange == 2: problem = "tan" + problem repet = self.read_txtname(problem) if repet == 0: self.problems.append(problem) # 將結果打印輸出 self.write_txt() # 清空列表 self.problems = [] #print(problem)
3、代碼冗余的部分有些多,在一些的判斷過程中,需要對幾種情況進行重復的二次判斷,有待改進。
通過這次的代碼交流學習,我認識到了自己代碼的問題和缺點,從他人的代碼中學習了一些優點,也在挑出隊友代碼中不合理部分的過程中提高了自習閱讀代碼的能力,也可以將隊友代碼中出現的問題引以為戒。最後,結對編程加油!一定要做得更好,沖鴨!
結對編程——初讀隊友代碼