Skip to main content

Posts

Showing posts from December, 2015

(CI) Jenkins PMD report for Objective-C with OCLint

OCLint is a  static code analysis  tool for improving quality and reducing defects by inspecting C, C++ and Objective-C code and looking for potential problems like: Possible bugs - empty if/else/try/catch/finally statements Unused code - unused local variables and parameters Complicated code - high cyclomatic complexity, NPath complexity and high NCSS Redundant code - redundant if statement and useless parentheses Code smells - long method and long parameter list Bad practices - inverted logic and parameter reassignment ... Installation: Step 1 : Download "oclint-0.x.x-x86_64-darwin-15.0.0.tar" from the downloads page . Unzip this file and see as below: Step 2: Copying OCLint to System PATH. Open Terminal prompt, and input some commands lines as follows: $ cd /Downloads/oclint-0.10.x $ cp bin/oclint* /usr/local/bin/ $ cp -rp lib/* /usr/local/lib/ Other option: Directly adding to PATH at here . Checking installation:   Open a new terminal prompt, and execute  o...

Improve Unit Test with OCMock

Adding OCMock to your project: Step 1: Download a release from the  downloads page . Step 2: Setup OCMock from the  iOS page . Step 3: Add an import to your unit tests. #import <OCMock/OCMock.h> Contents: Example classes Expect-run-verify Verify-after-running Void-Method Return-Method Block Delegate and DataSource Notification (Observer) Exception Advanced topics 1. Example classes Let's assume we are writing a little application. Our application have two classes as ClassA and ClassB. ClassB inherit from ClassA. They have some methods as below: 2. Expect-run-verify This is the original approach to mocking. First the mock object is set up with expectations, then the code under test is run, and afterwards the expectations are verified. If an expected method has not been invoked, or has not been invoked with the right arguments, then an error is reported. As shown it is possible to use argument constraints in the expect statement. Strict mocks can be created for classes and...

[Tip] Simulate various network conditions with "Network Link Conditioner"

Xcode provides a tool called Network Link Conditioner that can simulate various network conditions , including reduced bandwidth, high latency, DNS delays, packet loss, and so on. Before you ship any software that uses networking, you should install this tool, enable it, then run your software to see how it performs under real-world conditions. Here are a few things to test: Make sure your software remains usable even with lousy bandwidth. Tune your bandwidth consumption as much as you can. Increase the latency to three or four seconds. Make sure that any user-initiated operation is delayed by only a few seconds, not by a few minutes. When the network connection drops packets, your software should continue to function, just more slowly. Enabling  Network Link Conditioner  on iOS device: - Step 1: Open Settings -> Select Developer -> Select Status in group name ( Network link conditioner ) : - Step 2: Enable Network Link Conditioner -> Choose a profile of network ...

[Structural Pattern] Adapter pattern trong Objective C

Khái niệm: chuyển đổi interface của một class thành interface khác mà bạn trông đợi, để có thể tương thích với những interface đã có sẵn trước đó. Adapter cho phép những class hoạt động chung với nhau bất kể những interface của những class không tương thích với nhau. Cấu trúc lớp: Ví dụ mình có sơ đồ lớp như sau: - Adapter theo quan hệ Navigability hoặc Aggregation hay Composition như nhau: - Adapter theo quan hệ kế thừa Generalization hay Realization như sau: Cách sử dụng: Chúng ta thường dùng Adapter trong việc bảo trì ứng dụng. Chúng ta không thể viết code vào những đối tượng có sẵn trước đó nhưng vẫn phải đảm bảo hệ thống chạy tương thích với những lớp đó hay có thể sửa mới thì chúng ta ứng dụng Adapter vào. Code ví dụ trong Objective C:

[UML Class relationships] Phân biệt quan hệ Generalization và Realization trong Objective C và Swift

2 quan hệ này tương đối dễ phân biệt và thực thi. Generalization :  giống quan hệ kế thừa trong những ngôn ngữ lập trình. Theo sơ đồ trên thì ClassB đang kế thừa ClassA Code ví dụ trong Objective C : Code ví dụ trong Swift: Realization :  là quan hệ thực thi 1 interface. Theo sơ đồ trên thì ClassA thực thi những chức năng được định nghĩa sẵn trong InterfaceA. Code ví dụ trong Objective C: Code ví dụ trong Swift:

[UML Class relationships] Phân biệt quan hệ Aggregation và Composition trong Objective C và Swift

Aggregation ClassA có dùng lớp và giữa ClassB nhưng không cho lớp khác truy xuất ClassB thông qua ClassA.  Trong Objective C ta dùng thuộc tính là weak để thể hiện mối quan hệ này, code ví dụ như sau: Ngoài ra ta còn có sơ đồ Aggregation - Navigability: Theo sơ đồ này thì ta dùng property để lớp khác có thể truy xuất ClassB thông qua ClassA. Code ví dụ trong Objective C như: Unit Test giả sử ta huỷ đối tượng ClassB thì ClassA sẽ không gọi hàm trong ClassB được, do đó trong sơ đồ này nên dùng if để kiểm tra đối tượng khi truyền vào để tránh bị crash ứng dụng: Code ví dụ trong Swift như sau: Composition Composition giống như Aggregation nhưng giữ đối tượng theo kiểu strong, thì sẽ không phụ thuộc vào đối tượng truyền vào. Giống code ở trên nhưng ta thay weak thành strong thì sẽ thể hiện mối quan hệ này , ví dụ như sau: Cũng viết UnitTest như trên nhưng kết quả khi huỷ object tham chiếu thì đối tượng đó vẫn được giữ lại để thực hiện phương thức: Code ví dụ trong Swift như sau: Tà...

[UML Class relationships] Phân biệt quan hệ Association, Dependency và Navigability trong Objective C

Association :  Miêu tả 1 kết nối đơn giản giữa 2 lớp với nhau. Tuỳ theo từng trường hợp có cách thể hiện sơ đồ khác nhau. Mối quan hệ bình thường: Theo sơ đồ này thì ClassA có sử dụng ClassB hoặc ngược lại, nhưng không giữ đối tượng đó . Code ví dụ trong objective C như sau: Dependency: Thể hiện mối quan hệ phụ thuộc yếu giữa lớp này với lớp kia qua mũi tên và số thành phần thể hiện. Vì thế lớp này không cần phải giữ thực thể của lớp kia. Có thể truyền thông qua tham số hoặc tự khởi tạo trong chính lớp sử dụng. Theo sơ đồ này thì  ClassA có sử dụng ClassB, nhưng không giữ đối tượng đó . Code ví dụ trong objective C như sau: Navigability: Thể hiện mối quan hệ phụ thuộc mạnh giữa lớp này với lớp kia qua mũi tên và số thành phần thể hiện. Vì thế lớp này phải giữ thực thể của lớp kia chỉ được get chứ không cho set (readonly) . Mối quan hệ Association - Navigability (0..1): Theo sơ đồ này thì ClassA có sử dụng ClassB, và giữ đối tượng đó để có thể truy xuất bằng property. Nhưng C...

[Structural Pattern] Facade pattern trong Objective C

Khái niệm: Facade pattern cung cấp một interface thống nhất để nhóm những interface khác vào trong một hệ thống con. Facade định nghĩa một interface ở mức độ cao hơn để giúp cho hệ thống con dễ dàng sử dụng, giảm độ phức tạp của hệ thống. Source from Design Patterns ebook  Sơ đồ lớp:  Ví dụ đơn giản như một hệ thống con trong máy tính gồm có những đối tượng riêng rẽ như: CPU, Memory, HardDrive , ... Những đối tượng này hoạt động độc lập và có chức năng riêng. Làm thế nào để máy tính hoạt động dựa trên những đối tượng đó? Chúng ta phải tạo đối tượng ComputerFacade để quản lý và giúp người dùng thao tác trên hệ thống máy tính như sơ đồ sau: Cách sử dụng: Người dùng chỉ quan tâm đến đối tượng computer thể thực hiện tác vụ khởi động. Code ví dụ theo sơ đồ trên trong objective C: Tài liệu tham khảo: Wikipedia Design Patterns

[Creational Pattern] Factory method pattern trong Objective C

Tiếp theo bài Abstract factory pattern , bài này mình xin phân tích Factory method pattern . Mọi người thường nhầm 2 loại pattern này. Giờ sẽ đi sơ qua khái niệm của loại pattern này. Khái niệm : Định nghĩa một interface để khởi tạo một đối tượng đơn , nhưng nó cho phép lớp con quyết định để khởi tạo đối tượng của lớp nào đó. Cách phân biệt đơn giản giữa Factory method và Abstract factory như:  - Factory method là một phương thức đơn, dùng để khởi tạo đối tượng. Không nhấn mạnh mối quan hệ gia đình. -> Sơ đồ tương đối nhỏ . - Abstract factory là một đối tượng. Nhấn mạnh mối quan hệ gia đình. -> sơ đồ tương đối lớn . Trong Abstract factory sẽ chứa Factory method. Cấu trúc lớp: Dựa vào những yếu tố đó và sơ đồ của abstract factory, mình xin phân tích factory pattern nó nằm ở đâu. Khung màu đỏ là Abstract factory và khung màu xanh dương  là Factory method . Source from wikipedia Tài liệu tham khảo: Wikipedia Stackoverflow Sourcemaking

[Creational Pattern] Abstract factory pattern trong Objective C

Tiếp theo bài Singleton pattern . Bài này mình xin giới thiệu Abstract factory pattern trong nhóm Creational Pattern . Khái niệm : Abstract factory pattern cung cấp một interface để tạo những mối quan hệ gia đình giữa những đối tượng liên quan hoặc phụ thuộc, không quy định chi tiết các lớp cụ thể của chúng. Cấu trúc lớp: Hiện tại theo mình thấy thì có 2 cách để thể hiện Abstract factory như dùng interface hay dùng abstract class. Tuỳ theo cách dùng sẽ có cách vẽ sơ đồ lớp khác nhau. - Trường hợp dùng Interface làm abstract factory sẽ có sơ đồ như sau: - Trường hợp dùng Abstract Class làm abstract factory sẽ có sơ đồ như sau: Cách sử dụng: Lớp client chỉ cần quan tâm đến những abstract factory mà không cần quan tâm đến những lớp cụ thể như productA1, productA2, productB1, productB2. Sơ đồ như sau: Code ví dụ trong Objective C: Ví dụ mình dùng interface để thể hiện pattern này. - Sơ đồ ví dụ như bên dưới: Source from Wikipedia - Code về những factory, cách viết interface trong obj...

[Creational Pattern] Singleton pattern trong Objective C và Swift

Mình dự định viết một loạt bài về những design pattern trong iOS . Hy vọng chúng sẽ giúp ích cho các bạn khi lập trình cũng như phân tích hệ thống. Software design patterns có 4 nhóm chính là: Creational patterns : tập hợp những loại pattern khởi tạo đối tượng. Structural patterns : tập hợp những loại pattern liên quan đến cấu trúc. Behavioral patterns : tập hợp những loại pattern liên quan đến những hành động giữa những đối tượng. Concurrency patterns : tập hợp những loại pattern liên quan việc xử lý đồng thời. Pattern đầu tiên mình muốn giới thiệu với mọi người là Singleton Pattern thuộc Creational pattern.  Khái niệm:  Singleton Pattern dùng để khởi tạo một đối tượng (an instance) trong một lớp (a class). Cấu trúc lớp: Cách sử dụng : - Nếu đối tượng mà bạn thường xuyên sử dụng trong ứng dụng bạn có thể dùng singleton pattern. Trước giờ mình hay dùng singleton pattern để tạo lớp quản lý những connection hay database. - Bạn có thể ứng dụng singleton pattern vào những patte...