flymithra
05.02.2017
16:18:13
marat
05.02.2017
16:19:58
работа с уточкой не должна отличаться от работы с утками
Google
marat
05.02.2017
16:20:28
поэтому это не стратегия
и не композиция, ибо оверхед для уток
flymithra
05.02.2017
16:21:36
marat
05.02.2017
16:22:00
"Есть утка, которая крякает и плавает. Ученые создали искусственную утку, которая может искусственно крякать, искусственно плавать.
Как сделать уточку, которая будет искусственно плавать и крякать по-настоящему, без трех реализаций абстрактного класса уточки"
» искусственно плавать и крякать по-настоящему
в вашей реализации, уточка не умеет ни плавать, ни крякать
постановка задачи корректна, реализация нет
ps в реальности я бы делал третью реализацию интерфейса
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();
}
}
Vladimir
05.02.2017
16:28:16
Daniil
05.02.2017
16:28:51
Nikita
05.02.2017
16:28:57
Daniil
05.02.2017
16:29:05
само по себе сишком извращенно для этого случая
Google
Vladimir
05.02.2017
16:29:43
Daniil
05.02.2017
16:30:04
interface для метода act
если уж по полной
Vladimir
05.02.2017
16:30:28
Сам класс стратегии не несет в себе смысла, потому что его содержимое - действие. Что как бы не совпадает с названием
Daniil
05.02.2017
16:30:28
чутка перепутал - поправил
marat
05.02.2017
16:31:15
Daniil
05.02.2017
16:31:31
сразу ф-ция действия
и никаких проблем
Vladimir
05.02.2017
16:32:23
Класс Strategy неочевиден
Daniil
05.02.2017
16:33:28
marat
05.02.2017
16:33:43
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;
}
}
Daniil
05.02.2017
16:35:52
marat
05.02.2017
16:36:19
Daniil
05.02.2017
16:37:08
Автор, ты сам то помнишь правильный ответ?)
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();
}
}
не автор, но вот правильный ответ
Daniil
05.02.2017
16:46:36
Google
Nikita
05.02.2017
16:46:39
верно
если не считать слишком обобщенного класса Strategy, который нафиг не нужен - ты был близок
Daniil
05.02.2017
16:47:23
Та хорош) Нужен единый предок
Nikita
05.02.2017
16:47:30
нет
Lends
05.02.2017
16:47:35
что-то вы от ангуляра отдалились... го лучше конкурс на самую большую директиву
Daniil
05.02.2017
16:47:38
Чтобы мог обращаться к методу act()
Nikita
05.02.2017
16:48:10
и зачем?
Daniil
05.02.2017
16:48:23
чтобы код красивее был
и все
по сути не нужен
Nikita
05.02.2017
16:48:33
красивее - когда читабельнее
а act слишком обобщенный
doQuack и doSwim понятнее
Daniil
05.02.2017
16:49:20
swimStrategy.act() - исчерпывающая информация
swimStrategy.doSwim() - все равное что mycomponent.component
:)
ну, короче, я бы так сделал. А правильно это или нет - дело второе
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");
}
}
}
flymithra
05.02.2017
16:50:57
Ну мда
Google
Daniil
05.02.2017
16:51:33
Ну мда
Задачки чаще всего абсурдны
Vladimir
05.02.2017
16:51:38
Daniil
05.02.2017
16:51:43
и мало применимы к реальности
Nikita
05.02.2017
16:51:53
Vladimir
05.02.2017
16:52:17
и фабрики
Daniil
05.02.2017
16:52:34
flymithra
05.02.2017
16:52:40
Писать класс для метода, т.е. метод-класс, что? По моему это противоречит ООП
Vladimir
05.02.2017
16:53:38
Nikita
05.02.2017
16:54:16
flymithra
05.02.2017
16:54:22
>не забывай, что у тебя сейчас задача
Хорошо
Vladimir
05.02.2017
16:55:34
Смотри, ты передаешь всего функцию
Nikita
05.02.2017
16:55:59
Daniil
05.02.2017
16:56:05
Я и говорю, что в реальности для реаизации подобного я бы не стал делать то же, что сделал для этой задачи. А не то что factory и т.п. не применимы к реальности, как решил передернуть Вадимир
Vladimir
05.02.2017
16:56:40
Что, если в нашей стратегии будет ветвление?
И там уже одной функции не будет, стратегия будет нести в себе определенные свойства
flymithra
05.02.2017
16:56:42
Смотри, ты передаешь всего функцию
Я понял, как ты сделал, пояснять не нужно, это напоминает мне историю, где чувака в тестовом задании физбаз попросили написать, а он обучил нейронку
Vladimir
05.02.2017
16:56:53
flymithra
05.02.2017
16:58:05
Vladimir
05.02.2017
16:58:07
Палка о двух концах, задача эта с собеседования.
С одной стороны - хуйнем функцию и ок.
А что если этот код надо будет поддерживать?
Google
Daniil
05.02.2017
16:58:46
KISS
Vladimir
05.02.2017
16:59:08
И если кандидат подумает об этом "если" - шанс на оффер выше
Если ты конечно не гребцом на галеру идешь
Daniil
05.02.2017
17:02:35
Кто-нибудь работал Angular2 + Firebase?
Lends
05.02.2017
17:03:21
а если всё время думать о "если", можно закончить в бесконечной premature optimisation
Daniil
05.02.2017
17:05:00
Lends
05.02.2017
17:05:46
да я чисто вбросить... не читал даже о чём речь))
Daniil
05.02.2017
17:06:12
Vladimir
05.02.2017
17:06:18
а когда у тебя суровый прод
у которого еще 2 года развития впереди
Lends
05.02.2017
17:07:28
Просто ООП оно как бы по такой интерпрайз, когда у тебя есть ТЗ и оно не меняется.... один раз подумал, всё написал
Daniil
05.02.2017
17:07:32
лучше быть где-то посередине. Особенно если спек часто меняется
Vladimir
05.02.2017
17:07:38
Lends
05.02.2017
17:07:40
а в реале очень часто всё и вся меняется
Daniil
05.02.2017
17:08:04
Lends
05.02.2017
17:08:17
и как не изворачивайся, есть шанс переписать то, что раньше казалось гениальным и гибким
Daniil
05.02.2017
17:08:34
Вывод - пока можешь - делай просто. Усложнить время будет
Lends
05.02.2017
17:08:52
так что частенько если это не core, особо заморачиваться не стоит
H
05.02.2017
19:33:26
Всем привет! Подскажите, плиз, как работать с BehaviorSubject?
http://stackoverflow.com/questions/42055888/work-with-a-global-variable-initialized-via-behaviorsubject-angular2/42055905#42055905
Эта группа больше не существует