<翻译>[Code Smells]Objective-C中的代码异味(Code Smells)

#Code Smells(代码异味) in Objective-C

Code Smells(代码异味)。在工作中,我一直提及“代码异味”,但是到后来我才发现同事不明白我的意思。代码异味基本上就是说:假如它太臭,就改变它(If it stinks, change it.)。

“If it stinks, change it.”

“假如它太臭,就改变它。”

代码异味不是说“一段特别糟糕的代码,让你忍不住捂住鼻子”,而是,代码异味仅仅代表“需要改变一些东西”。平时你是无法注意到代码异味的,直到其他人提起它。就像Kent Beck和Martin Fowler在《Refactoring: Improving the Design of Existing Code》中所做的:写一段有异味的代码,然后说明如何处理它。

##Objective-C中的代码异味 《Refactoring: Improving the Design of Existing Code》这本书讲解了面向对象开发中的一些良好的实践。在这我将写一些针对Objective-C中代码异味的文章。下面是一个初步的列表:

  1. 9 Code Smells of Preprocessor Use(预处理中的9个代码异味)
  2. #imports Gone Wild! How to Tame File Dependencies(#import被滥用!如何管理文件的依赖关系?)
  3. 4 Ways Precompiled Headers Cripple Your Code
  4. Dot Notation in Objecitve-C: 100% Pure Evil
  5. Don't Message self in Objective-C init(and dealloc)

我认为这是一件非常有意思的事情,并且会引发人们的争论,是不是?这个系列定期会更新翻译,请收藏!

同时,可以看看一些相关的资料:

The Refactoring Book: A Game-Changer

Martin Fowler explains “code smell”

Summary of code smells from the book, with the refactorings to fix them

原文链接:http://qualitycoding.org/objective-c-code-smells/

转载于:https://my.oschina.net/yongbin45/blog/159404

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据SOLID原则,该代码存在以下不良设计: 1. 单一职责原则(SRP):`Library`类的`filemanage()`和`open()`方法既负责管理文件,又负责处理图书信息,违反了单一职责原则。 2. 开放封闭原则(OCP):如果需要增加新的图书管理方式或者数据存储方式,该类需要修改代码,违反了开放封闭原则。 在代码也存在以下不良代码: 1. 重复代码:`Library`类的`filemanage()`和`open()`方法都打开了文件,读写文件的方式也很相似,可以考虑将这部分代码封装成一个独立的方法。 2. 长方法:`Library`类的`filemanage()`和`open()`方法都非常长,包含了很多重复的代码以及不同的功能,应该将其拆分成短小的方法,每个方法只负责一个功能。 为了改善这些不良设计和不良代码,可以考虑使用以下重构方法: 1. 将文件管理和图书信息管理分开,创建两个独立的类分别负责这两个功能,符合单一职责原则。 2. 使用依赖倒置原则(DIP),通过接口或抽象类定义文件管理和图书管理的通用方法,使得这两个类可以独立扩展,不需要修改原有代码。 3. 提取公共代码,将文件读写的逻辑封装成一个独立的方法,减少重复代码。 4. 将长方法拆分成多个小方法,每个方法只负责一个功能,提高代码的可读性和可维护性。 重构后的代码如下: ```cpp class FileManager { public: virtual void save(const vector<Book*>& books) = 0; virtual vector<Book*> load() = 0; }; class TextFileManager : public FileManager { public: void save(const vector<Book*>& books) override { fstream f; f.open("books.txt", ios::out); for (auto book : books) { f << book->getName() << " " << book->getAuther() << " " << book->getNum() << " " << book->getinstock() << endl; } f.close(); } vector<Book*> load() override { vector<Book*> books; fstream f; f.open("books.txt", ios::in); string name; string auther; string number; int instock; while (f >> name >> auther >> number >> instock) { Book* book = new Book(name, auther, number, instock); books.push_back(book); } f.close(); return books; } }; class BookManager { public: virtual void addBook(Book* book) = 0; virtual void updateBook(Book* book) = 0; virtual vector<Book*> getAllBooks() = 0; }; class Library : public BookManager { public: Library(FileManager* fileManager) : fileManager_(fileManager) {} void addBook(Book* book) override { books_.push_back(book); } void updateBook(Book* book) override { for (auto b : books_) { if (b->getNum() == book->getNum()) { b->setname(book->getName()); b->setauther(book->getAuther()); b->setnum(book->getNum()); b->set(book->getinstock()); break; } } } vector<Book*> getAllBooks() override { return books_; } void save() { fileManager_->save(books_); cout << "保存成功" << endl; } void load() { books_ = fileManager_->load(); cout << "加载成功" << endl; } private: FileManager* fileManager_; vector<Book*> books_; }; ``` 在这个重构后的代码,`FileManager`类负责文件管理,包括读写文件等操作,`TextFileManager`是`FileManager`的一个实现类,具体实现了读写文本文件的方法。 `BookManager`类负责图书信息管理,包括添加图书、更新图书、获取所有图书等操作,`Library`是`BookManager`的一个实现类,具体实现了这些方法。 `Library`类的构造函数需要传入一个`FileManager`对象,可以通过依赖注入的方式来实现依赖倒置原则。 这个重构后的代码符合SOLID原则,每个类只负责一个功能,且类之间的依赖关系比较清晰,易于扩展和维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值