![](http://files.telegrammy.net/img2/12/12472.jpg)
flymithra
05.02.2017
16:18:13
![](http://files.telegrammy.net/img2/6/6266.jpg)
marat
05.02.2017
16:19:58
работа с уточкой не должна отличаться от работы с утками
![](http://files.telegrammy.net/img2/t_logo.png)
Google
![](http://files.telegrammy.net/img2/6/6266.jpg)
marat
05.02.2017
16:20:28
поэтому это не стратегия
и не композиция, ибо оверхед для уток
![](http://files.telegrammy.net/img2/12/12472.jpg)
flymithra
05.02.2017
16:21:36
![](http://files.telegrammy.net/img2/6/6266.jpg)
marat
05.02.2017
16:22:00
"Есть утка, которая крякает и плавает. Ученые создали искусственную утку, которая может искусственно крякать, искусственно плавать.
Как сделать уточку, которая будет искусственно плавать и крякать по-настоящему, без трех реализаций абстрактного класса уточки"
» искусственно плавать и крякать по-настоящему
в вашей реализации, уточка не умеет ни плавать, ни крякать
постановка задачи корректна, реализация нет
ps в реальности я бы делал третью реализацию интерфейса
![](/img/link.jpg)
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:27:48
Ну можно вот так извратиться:
abstract Strategy
{
public act()
}
RealKryaStrategy extends Strategy{
public act(){
}
}
FakeKryaStrategy extends Strategy{
public act(){
}
}
RealSwimStrategy extends Strategy{
public act(){
}
}
FakeSwimStrategy extends Strategy{
public act(){
}
}
class Utka()
public set swimStrategy(str:Strategy)
{
this.swimStrategy = str;
}
public set kryaStrategy(str:Strategy)
{
this.swimStrategy = str
}
public swim()
{
this.swimStrategy.act();
}
public krya()
{
this.kryaStrategy.act();
}
}
![](http://files.telegrammy.net/img2/6/6062.jpg)
Vladimir
05.02.2017
16:28:16
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:28:51
![](http://files.telegrammy.net/img2/49/49642.jpg)
Nikita
05.02.2017
16:28:57
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:29:05
само по себе сишком извращенно для этого случая
![](http://files.telegrammy.net/img2/t_logo.png)
Google
![](http://files.telegrammy.net/img2/6/6062.jpg)
Vladimir
05.02.2017
16:29:43
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:30:04
interface для метода act
если уж по полной
![](http://files.telegrammy.net/img2/6/6062.jpg)
Vladimir
05.02.2017
16:30:28
Сам класс стратегии не несет в себе смысла, потому что его содержимое - действие. Что как бы не совпадает с названием
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:30:28
чутка перепутал - поправил
![](http://files.telegrammy.net/img2/6/6266.jpg)
marat
05.02.2017
16:31:15
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:31:31
сразу ф-ция действия
и никаких проблем
![](http://files.telegrammy.net/img2/6/6062.jpg)
Vladimir
05.02.2017
16:32:23
Класс Strategy неочевиден
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:33:28
![](http://files.telegrammy.net/img2/6/6266.jpg)
marat
05.02.2017
16:33:43
![](http://files.telegrammy.net/img2/12/12472.jpg)
flymithra
05.02.2017
16:34:03
Я правда не понимаю до конца вашей задачи скорее всего, ну как бы зачем мутить так воду, если я могу создавать каких мне угодно уток так (
ДАВАЙТЕ УЖЕ ВЕРНОЕ РЕШЕНИЕ В СТУДИЮ НЕ ТОМИТЕ
public class Utka {
boolean kra, swi;
public Utka (boolean kra, boolean swi) {
this.kra = kra;
this.swi = swi;
}
}
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:35:52
![](http://files.telegrammy.net/img2/6/6266.jpg)
marat
05.02.2017
16:36:19
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:37:08
Автор, ты сам то помнишь правильный ответ?)
![](http://files.telegrammy.net/img2/49/49642.jpg)
Nikita
05.02.2017
16:45:55
class QuackStrategy {
abstract doQuack();
}
class RealQuackStrategy : QuackStrategy{
doQuack(){ /* do real quack*/ }
}
class FakeQuackStrategy : QuackStrategy{
doQuack(){ /* do fake quack*/ }
}
///по аналогии - SwimStrategy, с соответствующими реализациями real и fake
class Duck {
private QuackStrategy quack;
private SwimStrategy swim;
Duck(QuackStrategy _quack, SwimStrategy _swim) {
this.quack = _quack;
this.swim = _swim;
}
doQuack() {
this.quack.doQuack();
}
doSwim() {
this.quack.doSwim();
}
}
не автор, но вот правильный ответ
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:46:36
![](http://files.telegrammy.net/img2/t_logo.png)
Google
![](http://files.telegrammy.net/img2/49/49642.jpg)
Nikita
05.02.2017
16:46:39
верно
если не считать слишком обобщенного класса Strategy, который нафиг не нужен - ты был близок
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:47:23
Та хорош) Нужен единый предок
![](http://files.telegrammy.net/img2/49/49642.jpg)
Nikita
05.02.2017
16:47:30
нет
![](http://files.telegrammy.net/img2/6/6084.jpg)
Lends
05.02.2017
16:47:35
что-то вы от ангуляра отдалились... го лучше конкурс на самую большую директиву
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:47:38
Чтобы мог обращаться к методу act()
![](http://files.telegrammy.net/img2/49/49642.jpg)
Nikita
05.02.2017
16:48:10
и зачем?
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:48:23
чтобы код красивее был
и все
по сути не нужен
![](http://files.telegrammy.net/img2/49/49642.jpg)
Nikita
05.02.2017
16:48:33
красивее - когда читабельнее
а act слишком обобщенный
doQuack и doSwim понятнее
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:49:20
swimStrategy.act() - исчерпывающая информация
swimStrategy.doSwim() - все равное что mycomponent.component
:)
ну, короче, я бы так сделал. А правильно это или нет - дело второе
![](/img/link.jpg)
![](http://files.telegrammy.net/img2/6/6062.jpg)
Vladimir
05.02.2017
16:50:44
Я тут покурить вышел, а потом залип на ерроры шарповские.
Но вот:
using System;
public class Program {
public static void Main(string[] args) {
var duck = new Duck(new NativeCrackStrategy(), new FakeSwimStrategy());
duck.Crack();
duck.Swim();
}
public interface ICrackStrategy {
void Crack();
}
public interface ISwimStrategy {
void Swim();
}
public class Duck {
private ICrackStrategy _crackStrategy;
private ISwimStrategy _swimStrategy;
public Duck(ICrackStrategy crack, ISwimStrategy swim) {
this._crackStrategy = crack;
this._swimStrategy = swim;
}
public void Crack() {
this._crackStrategy.Crack();
}
public void Swim() {
this._swimStrategy.Swim();
}
}
public class NativeCrackStrategy: ICrackStrategy {
public void Crack() {
Console.WriteLine("crack like a native");
}
}
public class FakeCrackStrategy: ICrackStrategy {
public void Crack() {
Console.WriteLine("crack like a fake");
}
}
public class NativeSwimStrategy: ISwimStrategy {
public void Swim() {
Console.WriteLine("swim like a native");
}
}
public class FakeSwimStrategy: ISwimStrategy {
public void Swim() {
Console.WriteLine("swim like a fake");
}
}
}
![](/img/link.jpg)
![](http://files.telegrammy.net/img2/12/12472.jpg)
flymithra
05.02.2017
16:50:57
Ну мда
![](http://files.telegrammy.net/img2/t_logo.png)
Google
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:51:33
Ну мда
Задачки чаще всего абсурдны
![](http://files.telegrammy.net/img2/6/6062.jpg)
Vladimir
05.02.2017
16:51:38
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:51:43
и мало применимы к реальности
![](http://files.telegrammy.net/img2/49/49642.jpg)
Nikita
05.02.2017
16:51:53
![](http://files.telegrammy.net/img2/6/6062.jpg)
Vladimir
05.02.2017
16:52:17
и фабрики
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:52:34
![](http://files.telegrammy.net/img2/12/12472.jpg)
flymithra
05.02.2017
16:52:40
Писать класс для метода, т.е. метод-класс, что? По моему это противоречит ООП
![](http://files.telegrammy.net/img2/6/6062.jpg)
Vladimir
05.02.2017
16:53:38
![](http://files.telegrammy.net/img2/49/49642.jpg)
Nikita
05.02.2017
16:54:16
![](http://files.telegrammy.net/img2/12/12472.jpg)
flymithra
05.02.2017
16:54:22
>не забывай, что у тебя сейчас задача
Хорошо
![](/img/link.jpg)
![](http://files.telegrammy.net/img2/6/6062.jpg)
Vladimir
05.02.2017
16:55:34
Смотри, ты передаешь всего функцию
![](http://files.telegrammy.net/img2/49/49642.jpg)
Nikita
05.02.2017
16:55:59
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:56:05
Я и говорю, что в реальности для реаизации подобного я бы не стал делать то же, что сделал для этой задачи. А не то что factory и т.п. не применимы к реальности, как решил передернуть Вадимир
![](http://files.telegrammy.net/img2/6/6062.jpg)
Vladimir
05.02.2017
16:56:40
Что, если в нашей стратегии будет ветвление?
И там уже одной функции не будет, стратегия будет нести в себе определенные свойства
![](http://files.telegrammy.net/img2/12/12472.jpg)
flymithra
05.02.2017
16:56:42
Смотри, ты передаешь всего функцию
Я понял, как ты сделал, пояснять не нужно, это напоминает мне историю, где чувака в тестовом задании физбаз попросили написать, а он обучил нейронку
![](http://files.telegrammy.net/img2/6/6062.jpg)
Vladimir
05.02.2017
16:56:53
![](http://files.telegrammy.net/img2/12/12472.jpg)
flymithra
05.02.2017
16:58:05
![](http://files.telegrammy.net/img2/6/6062.jpg)
Vladimir
05.02.2017
16:58:07
Палка о двух концах, задача эта с собеседования.
С одной стороны - хуйнем функцию и ок.
А что если этот код надо будет поддерживать?
![](http://files.telegrammy.net/img2/t_logo.png)
Google
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
16:58:46
KISS
![](http://files.telegrammy.net/img2/6/6062.jpg)
Vladimir
05.02.2017
16:59:08
И если кандидат подумает об этом "если" - шанс на оффер выше
Если ты конечно не гребцом на галеру идешь
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
17:02:35
Кто-нибудь работал Angular2 + Firebase?
![](http://files.telegrammy.net/img2/6/6084.jpg)
Lends
05.02.2017
17:03:21
а если всё время думать о "если", можно закончить в бесконечной premature optimisation
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
17:05:00
![](http://files.telegrammy.net/img2/6/6084.jpg)
Lends
05.02.2017
17:05:46
да я чисто вбросить... не читал даже о чём речь))
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
17:06:12
![](http://files.telegrammy.net/img2/6/6062.jpg)
Vladimir
05.02.2017
17:06:18
а когда у тебя суровый прод
у которого еще 2 года развития впереди
![](http://files.telegrammy.net/img2/6/6084.jpg)
Lends
05.02.2017
17:07:28
Просто ООП оно как бы по такой интерпрайз, когда у тебя есть ТЗ и оно не меняется.... один раз подумал, всё написал
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
17:07:32
лучше быть где-то посередине. Особенно если спек часто меняется
![](http://files.telegrammy.net/img2/6/6062.jpg)
Vladimir
05.02.2017
17:07:38
![](http://files.telegrammy.net/img2/6/6084.jpg)
Lends
05.02.2017
17:07:40
а в реале очень часто всё и вся меняется
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
17:08:04
![](http://files.telegrammy.net/img2/6/6084.jpg)
Lends
05.02.2017
17:08:17
и как не изворачивайся, есть шанс переписать то, что раньше казалось гениальным и гибким
![](http://files.telegrammy.net/img2/t_logo.png)
Daniil
05.02.2017
17:08:34
Вывод - пока можешь - делай просто. Усложнить время будет
![](http://files.telegrammy.net/img2/6/6084.jpg)
Lends
05.02.2017
17:08:52
так что частенько если это не core, особо заморачиваться не стоит
![](http://files.telegrammy.net/img2/t_logo.png)
H
05.02.2017
19:33:26
Всем привет! Подскажите, плиз, как работать с BehaviorSubject?
http://stackoverflow.com/questions/42055888/work-with-a-global-variable-initialized-via-behaviorsubject-angular2/42055905#42055905
Эта группа больше не существует