Tuesday, December 29, 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 oclint directly from there and expect message similar to below:
  • $ oclint
    oclint: Not enough positional command line arguments specified!
    Must specify at least 1 positional arguments: See: oclint -help
    

Wednesday, December 23, 2015

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:

Monday, December 21, 2015

[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):


Tuesday, December 15, 2015

[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:

Monday, December 14, 2015

[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.


Friday, December 11, 2015

[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:

[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:


Thursday, December 10, 2015

[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 

[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.

Tuesday, December 8, 2015

[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:

Thursday, December 3, 2015

[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à:
  1. Creational patterns: tập hợp những loại pattern khởi tạo đối tượng.
  2. Structural patterns: tập hợp những loại pattern liên quan đến cấu trúc.
  3. 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.
  4. 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: