Skip to content

Instantly share code, notes, and snippets.

@Integralist
Integralist / Design Patterns: Adapter vs Facade vs Bridge.md
Last active March 27, 2024 08:22
Design Patterns: Adapter vs Facade vs Bridge

The three design patterns (Adapter, Facade and Bridge) all produce the result of a clean public API. The difference between the patterns are usually due to a subtle context shift (and in some cases, a behavioural requirement).

Adapter

The primary function of an Adapter is to produce a unified interface for a number of underlying and unrelated objects.

You will notice this pattern being utilised in many applications. For example, ActiveRecord (the popular Ruby ORM; object-relational mapping) creates a unified interface as part of its API but the code underneath the interface is able to communicate with many different types of databases. Allowing the consumer of the API to not have to worry about specific database implementation details.

The principle structure of this pattern is:

@mikaxyz
mikaxyz / AppDelegate.swift
Last active December 30, 2015 11:34
Namespaced classes in swift
//
// AppDelegate.swift
// Namespaced
//
// Created by Mika Jauhonen on 2014-09-18.
// Copyright (c) 2014 Mika Jauhonen. All rights reserved.
//
import UIKit
@mkf-simpson
mkf-simpson / gist:6abdd838bb0177614dc5
Created June 30, 2014 11:12
task number from branch name
#!/usr/bin/env bash
branch=$(git symbolic-ref --short HEAD)
branch_description=$(echo $branch | cut -f2 -d/)
prefix=$(echo $branch_description | cut -f1 -d-)
number=$(echo $branch_description | cut -f2 -d-)
git commit -am "$prefix-$number $1"
@denisshevchenko
denisshevchenko / CV.hs
Last active August 27, 2018 20:41
Моё резюме, написанное на Haskell
{-
Денис Шевченко, 2015
-}
module Main where
import Control.Monad.Writer.Lazy
import Data.Functor ((<$>))
import Data.List (dropWhileEnd)
import Data.Char (isSpace)
@dhh
dhh / test_induced_design_damage.rb
Last active November 2, 2024 00:52
This is an extraction from Jim Weirich's "Decoupling from Rails" talk, which explained how to apply the hexagonal design pattern to make every layer of your application easily unit testable (without touching the database etc). It only seeks to extract a single method, the EmployeesController#create method, to illustrate the design damage that's …
# Original Rails controller and action
class EmployeesController < ApplicationController
def create
@employee = Employee.new(employee_params)
if @employee.save
redirect_to @employee, notice: "Employee #{@employee.name} created"
else
render :new
end
@ericallam
ericallam / gist:11214298
Created April 23, 2014 12:58
Fixing animation snapback without setDisableActions:YES
// Implements the solution for solving "snapback" found in
// Chapter 8 of "iOS Core Animation Advanced Techniques" by Nick Lockwood
// without the need to use setDisableActions: to override the implicit animation,
// instead passing in the implicit animation key in addAnimation:forKey:
// With setDisableActions
- (void)applyBasicAnimation:(CABasicAnimation *)animation toLayer:(CALayer *)layer
{
//set the from value (using presentation layer if available)
animation.fromValue = [layer.presentationLayer ?: layer valueForKeyPath:animation.keyPath];
@steipete
steipete / CoreFoundationSurprises.m
Last active August 29, 2015 13:59
Testing "if you use a default allocator, and default callbacks, CF will generate an NS collection instead". (https://twitter.com/Catfish_Man/status/455592839334723584). We currently only have that on Mavericks, but since it the same codebase I'm 100% sure this will be in iOS 8 as well.
// Code using the default allocator and callbacks now actually returns an NSArray (__NSArrayM), and no longer a toll-free-bridged object.
NSArray *test = CFBridgingRelease(CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks));
NSArray *test3 = CFBridgingRelease(CFArrayCreate(kCFAllocatorDefault, NULL, 0, &kCFTypeArrayCallBacks));
// This is custom and will always return __NSCFArray
NSArray *test2 = CFBridgingRelease(CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL));
// This will return __NSArrayI.
NSArray *test4 = [NSArray array];
@mattt
mattt / UTTypeForImageData.m
Created March 27, 2014 23:19
A quick function for determining an image's file type by its first couple of bytes
@import MobileCoreServices;
static CFStringRef UTTypeForImageData(NSData *data) {
const unsigned char * bytes = [data bytes];
if (data.length >= 8) {
if (bytes[0] == 0x89 && bytes[1] == 0x50 && bytes[2] == 0x4E && bytes[3] == 0x47 && bytes[4] == 0x0D && bytes[5] == 0x0A && bytes[6] == 0x1A && bytes[7] == 0x0A) {
return kUTTypePNG;
}
}
@zsup
zsup / ddd.md
Last active May 6, 2025 10:50
Documentation-Driven Development (DDD)

Documentation-Driven Development

The philosophy behind Documentation-Driven Development is a simple: from the perspective of a user, if a feature is not documented, then it doesn't exist, and if a feature is documented incorrectly, then it's broken.

  • Document the feature first. Figure out how you're going to describe the feature to users; if it's not documented, it doesn't exist. Documentation is the best way to define a feature in a user's eyes.
  • Whenever possible, documentation should be reviewed by users (community or Spark Elite) before any development begins.
  • Once documentation has been written, development should commence, and test-driven development is preferred.
  • Unit tests should be written that test the features as described by the documentation. If the functionality ever comes out of alignment with the documentation, tests should fail.
  • When a feature is being modified, it should be modified documentation-first.
  • When documentation is modified, so should be the tests.
@elnaqah
elnaqah / RTF In textView
Created February 24, 2014 00:40
load rtf file in UItextView
NSURL *rtfPath = [[NSBundle mainBundle] URLForResource: @"description_ar" withExtension:@"rtf"];
NSAttributedString *attributedStringWithRtf = [[NSAttributedString alloc] initWithFileURL:rtfPath options:@{NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType} documentAttributes:nil error:nil];
self.textView.attributedText=attributedStringWithRtf;