Шаблоны Инверсии управления (IoC) и Внедрения зависимости (DI) - все об удалении зависимостей от Вашего кода.
, Например, скажите, что Ваше приложение имеет компонент текстового редактора, и Вы хотите обеспечить проверку правописания. Ваш стандартный код выглядел бы примерно так:
public class TextEditor {
private SpellChecker checker;
public TextEditor() {
this.checker = new SpellChecker();
}
}
то, Что мы сделали здесь, создает зависимость между TextEditor
и SpellChecker
. В сценарии МОК мы вместо этого сделали бы что-то вроде этого:
public class TextEditor {
private IocSpellChecker checker;
public TextEditor(IocSpellChecker checker) {
this.checker = checker;
}
}
В первом примере кода мы инстанцируем SpellChecker
(this.checker = new SpellChecker();
), что означает TextEditor
, класс непосредственно зависит от SpellChecker
класс.
Во втором примере кода мы создаем абстракцию при наличии SpellChecker
класс зависимости в [1 110] подпись конструктора (не инициализирующий зависимость в классе). Это позволяет нам звонить, зависимость тогда передают его классу TextEditor как так:
SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);
Теперь клиент, создающий TextEditor
, класс имеет контроль, по которому SpellChecker
реализация для использования потому что мы вводим зависимость к TextEditor
подпись.
Это - просто простой пример, существует хороший ряд статей Simone Busoli, который объясняет его более подробно.
Одним из вариантов является пакет network , входящий в семейство statnet пакетов R для статистического анализа социальных сетей. Он обрабатывает сетевые данные разреженным образом, что хорошо для больших наборов данных.
Ниже я делаю следующее:
A = read.table(file="so.txt",header=T) A p1 p2 counts 1 a b 100 2 a c 200 3 a d 100 4 b c 80 5 b d 90 6 b e 100 7 c d 100 8 c e 40 9 d e 60 library(network) net = network(A[,1:2]) # Get summary information about your network net Network attributes: vertices = 5 directed = TRUE hyper = FALSE loops = FALSE multiple = FALSE bipartite = FALSE total edges= 9 missing edges= 0 non-missing edges= 9 Vertex attribute names: vertex.names adjacency matrix: a b c d e a 0 1 1 1 0 b 0 0 1 1 1 c 0 0 0 1 1 d 0 0 0 0 1 e 0 0 0 0 0 set.edge.attribute(net,"weight",A[,3]) gplot(net) ## Another cool feature s = as.sociomatrix(net,attrname="weight") plot.sociomatrix(s)
Вот как построить сетевой график данных в igraph :
d <- data.frame(p1=c('a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd'),
p2=c('b', 'c', 'd', 'c', 'd', 'e', 'd', 'e', 'e'),
counts=c(100, 200, 100,80, 90,100, 100,40,60))
library(igraph)
g <- graph.data.frame(d, directed=TRUE)
print(g, e=TRUE, v=TRUE)
tkplot(g, vertex.label=V(g)$name)
Еще я работаю в igraph. Один из способов создания графа - записать список всех узлов «от» до »в текстовый файл и прочитать его обратно как объект графа. Объект-граф может подвергаться множеству теоретико-графических процессов и может обрабатывать довольно большие сети.
По моему опыту, igraph - мой любимый пакет для больших теоретико-графических работ. Он эффективен с точки зрения памяти и имеет несколько очень хороших алгоритмов. igraph использует внутреннюю структуру данных типа edgelist.
Для более простых / небольших вещей я обычно использую пакет sna («анализ социальных сетей»). Он отлично подходит для интерактивной работы и построения небольших сетей. sna использует больше структуры данных матрицы смежности.